设置元数据时无法更新Azure Storage Blob元数据

时间:2019-11-25 13:33:34

标签: 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 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。

enter image description here

但是,如果我用元数据更新注释行,则一切正常,并且可以创建blob。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,我测试您的代码,即使将其部署到Azure上,它也可能对我有用。因此,然后我将outputBlob绑定更改为CloudBlockBlob并使用UploadFromStreamAsync上传blob,然后遇到了同样的问题。经过研究,我想这是由image.Save()方法引起的,使用JpegEncoder,流应该设置正确的位置。

下面的代码是我的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();
                }

            }

如果您仍然想使用Stream outputBlob绑定,也许可以使用相同的方式,只需更改几行代码即可。

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);

假设这两种方法都可以使用,如果您对功能仍然感到困惑,请提供更多信息或您的环境,以便我们进行更详细的测试。