C# Can';设置元数据时更新Azure存储Blob元数据

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

我有一个调整图像大小的Azure函数

[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);
假设这两种方法都能起作用,如果您对自己的功能仍有疑问,请提供更多信息或您的环境,以便我进行更详细的测试