O Azure C # WebJob usando o ImageResizer não está configurando corretamente o tipo de conteúdo
Estou trabalhando em um WebJob do Azure para redimensionar imagens recém-carregadas. O redimensionamento funciona, mas as imagens recém-criadas não têm seu tipo de conteúdo definido corretamente no Armazenamento de Blob. Em vez disso, eles são listados application / octet-stream. Aqui, o código que manipula o redimensionamento:
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));
}
Minha pergunta é onde e como eu definiria o tipo de conteúdo? É algo que tenho que fazer manualmente ou há um erro no modo como estou usando a biblioteca, impedindo-a de atribuir o mesmo tipo de conteúdo que o original (o comportamento que a biblioteca diz que deve exibir)?
Obrigado!
ATUALIZAÇÃO FINAL
Obrigado a Thomas por sua ajuda para chegar à solução final, aqui está!
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; }
}