C# Can';设置元数据时更新Azure存储Blob元数据
我有一个调整图像大小的Azure函数C# Can';设置元数据时更新Azure存储Blob元数据,c#,azure-functions,azure-storage-blobs,C#,Azure Functions,Azure Storage Blobs,我有一个调整图像大小的Azure函数 [FunctionName(nameof(ResizeBlob))] public static async Task ResizeBlob( [BlobTrigger("originals/{name}")] CloudBlockBlob inputBlob, [Blob("resized/{name}", FileAccess.Write)] Stream outputBlob, ILogger log) { await inp
[FunctionName(nameof(ResizeBlob))]
public static async Task ResizeBlob(
[BlobTrigger("originals/{name}")] CloudBlockBlob inputBlob,
[Blob("resized/{name}", FileAccess.Write)] Stream outputBlob,
ILogger log)
{
await inputBlob.FetchAttributesAsync();
if (!inputBlob.Metadata.ContainsKey("Resized") || inputBlob.Metadata["Resized"] == bool.FalseString)
{
var inputBlobStream = await inputBlob.OpenReadAsync();
using (var image = Image.Load(inputBlobStream))
{
image.Mutate(x => x.Resize(1920, 1080));
image.Save(outputBlob, new JpegEncoder());
// If comment next statements, everything is ok, otherwise - it's not saving correctly
inputBlob.Metadata["ResizedFHD"] = bool.TrueString;
await inputBlob.SetMetadataAsync();
}
}
}
因为我无法停止在元数据更新时触发[BlobTrigger],所以我需要通过添加特殊元数据来解决多个文件大小调整的问题。但是,在调整大小后,我无法设置此元数据-这会导致对象长度为0
但是,如果我用元数据更新对行进行注释,那么一切都正常,blob的创建也正常
有什么想法吗?首先,我测试了你的代码,它可以为我工作,甚至可以将它部署到azure。因此,我将
outputBlob
绑定更改为CloudBlockBlob
,并使用uploadfromstreeamasync
上传blob,然后我遇到了同样的问题。经过研究,我认为这是由image.Save()
方法引起的,使用JPEG编码器,流应该设置正确的位置
下面的代码是我的CloudBlockBlob
类型代码,您可以试一试
public static async System.Threading.Tasks.Task RunAsync([BlobTrigger("image/{name}", Connection = "AzureWebJobsStorage")]CloudBlockBlob inputBlob,
[Blob("resized/{name}", FileAccess.Write)] CloudBlockBlob outputBlob, string name, ILogger log)
{
if (!inputBlob.Metadata.ContainsKey("Resized") || inputBlob.Metadata["Resized"] == bool.FalseString)
{
var inputBlobStream = await inputBlob.OpenReadAsync();
System.IO.MemoryStream blobstream = new System.IO.MemoryStream();
using (var image = Image.Load(inputBlobStream))
{
image.Mutate(x => x.Resize(1920, 1080));
image.Save(blobstream , new JpegEncoder());
blobstream.Seek(0, SeekOrigin.Begin);
await outputBlob.UploadFromStreamAsync(blobstream);
// If comment next statements, everything is ok, otherwise - it's not saving correctly
inputBlob.Metadata["ResizedFHD"] = bool.TrueString;
await inputBlob.SetMetadataAsync();
}
}
如果您仍然想使用streamoutputblob
绑定,也许您可以使用相同的方法,只需更改几行代码
image.Mutate(x => x.Resize(1920, 1080));
//image.Save(outputBlob, new JpegEncoder());
image.Save(blobstream, new JpegEncoder());
blobstream.Seek(0, SeekOrigin.Begin);
blobstream.CopyTo(outputBlob, 1024);
假设这两种方法都能起作用,如果您对自己的功能仍有疑问,请提供更多信息或您的环境,以便我进行更详细的测试