I'm working on an Azure WebJob to to resize newly uploaded images. The resizing works, but the newly created images do not have their content type properly set in Blob Storage. Instead they are listed application/octet-stream. Here the code handling the resizing:
public static void ResizeImagesTask(
[BlobTrigger("input/{name}.{ext}")] Stream inputBlob,
string name,
string ext,
IBinder binder)
{
int[] sizes = { 800, 500, 250 };
var inputBytes = inputBlob.CopyToBytes();
foreach (var width in sizes)
{
var input = new MemoryStream(inputBytes);
var output = binder.Bind<Stream>(new BlobAttribute($"output/{name}-w{width}.{ext}", FileAccess.Write));
ResizeImage(input, output, width);
}
}
private static void ResizeImage(Stream input, Stream output, int width)
{
var instructions = new Instructions
{
Width = width,
Mode = FitMode.Carve,
Scale = ScaleMode.Both
};
ImageBuilder.Current.Build(new ImageJob(input, output, instructions));
}
My question is where and how would I set the content-type? Is it something I have to do manually, or is there an error in how I'm using the library preventing it from assigning the same content-type as the original (the behavior the library says it should exhibit)?
Thanks!
FINAL UPDATE
Thanks to Thomas for his help in arriving at the final solution, here it is!
public class Functions
{
// output blolb sizes
private static readonly int[] Sizes = { 800, 500, 250 };
public static void ResizeImagesTask(
[QueueTrigger("assetimage")] AssetImage asset,
string container,
string name,
string ext,
[Blob("{container}/{name}_master.{ext}", FileAccess.Read)] Stream blobStream,
[Blob("{container}")] CloudBlobContainer cloudContainer)
{
// Get the mime type to set the content type
var mimeType = MimeMapping.GetMimeMapping($"{name}_master.{ext}");
foreach (var width in Sizes)
{
// Set the position of the input stream to the beginning.
blobStream.Seek(0, SeekOrigin.Begin);
// Get the output stream
var outputStream = new MemoryStream();
ResizeImage(blobStream, outputStream, width);
// Get the blob reference
var blob = cloudContainer.GetBlockBlobReference($"{name}_{width}.{ext}");
// Set the position of the output stream to the beginning.
outputStream.Seek(0, SeekOrigin.Begin);
blob.UploadFromStream(outputStream);
// Update the content type => don't know if required
blob.Properties.ContentType = mimeType;
blob.SetProperties();
}
}
private static void ResizeImage(Stream input, Stream output, int width)
{
var instructions = new Instructions
{
Width = width,
Mode = FitMode.Carve,
Scale = ScaleMode.Both
};
var imageJob = new ImageJob(input, output, instructions);
// Do not dispose the source object
imageJob.DisposeSourceObject = false;
imageJob.Build();
}
public static void PoisonErrorHandler([QueueTrigger("webjobs-blogtrigger-poison")] BlobTriggerPosionMessage message, TextWriter log)
{
log.Write("This blob couldn't be processed by the original function: " + message.BlobName);
}
}
public class AssetImage
{
public string Container { get; set; }
public string Name { get; set; }
public string Ext { get; set; }
}
public class BlobTriggerPosionMessage
{
public string FunctionId { get; set; }
public string BlobType { get; set; }
public string ContainerName { get; set; }
public string BlobName { get; set; }
public string ETag { get; set; }
}