我正在开发一个Azure WebJob用于调整新上传的图像大小。调整大小是成功的,但是在Blob存储中,新创建的图像没有正确设置其内容类型。相反,它们被列为application/octet-stream。这里是处理调整大小的代码:
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));
}
我的问题是在哪里以及如何设置内容类型?这是我需要手动完成的操作还是我使用的库中存在错误,导致其不能分配与原始内容相同的内容类型(库所说应该表现出的行为)?
谢谢!
最终更新
感谢Thomas的帮助,我们找到了最终的解决方案,下面是它!
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; }
}