【问题标题】:Azure Blob Storage - how do I get the Blob Storage ID after uploading a blob?Azure Blob 存储 - 上传 Blob 后如何获取 Blob 存储 ID?
【发布时间】:2021-01-20 20:25:42
【问题描述】:

我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数据库中。如何找到已保存项目的 ID。这是命令:

Azure.Response<BlobContentInfo> blobs = containerClient.UploadBlob(fileName, outStream);

我似乎在返回的对象中找不到它

https://docs.microsoft.com/en-us/dotnet/api/azure.storage.blobs.models.blobcontentinfo?view=azure-dotnet

我的原始图片是使用 PowerApps 创建和保存的,其中控件确实返回 Blob ID - 见下文:

 Set(
        gblSentBlob,
        AzureBlobStorage.CreateFile(
            Text(gblAzureFileContainer),
            GUID() & ".jpg",
            camControl.Photo
        )
    );
    If(
        !IsEmpty(gblSentBlob),
        Notify("Picture saved to Azure storage:" & gblSentBlob.DisplayName);
        UpdateContext({locFileName: gblSentBlob.DisplayName});
        UpdateContext({locAzureStorageID: Text(gblSentBlob.Id)}); // <- *** this is the Blob ID ***
        UpdateContext({locSavedToAzure: true});

这里,AzureBlobStorage.CreateFile 函数返回一个包含我要查找的 ID 的对象。

如何在我的控制台应用程序中获取此 ID。

典型的 Blob ID 如下所示:

JTJmc2hpcmVibG9iY29udGFpbmVyJTJmNTk3MzQ4NGYtNGVhNy00NzJkLTkyMzQtYWIwNzM5NWNlOGRiLmpwZw==

然后我可以使用以下(在 PowerApps 中)检索要显示的图像

AzureBlobStorage.GetFileContent(ThisItem.BlobStorageID)

我的完整代码:

 var blobClient = containerClient.GetBlobClient(blobName);
                using Stream stream = await blobClient.OpenReadAsync();
                Image myImage = Image.FromStream(stream);
                Image myThumbnail = PictureProcessor.returnThumbnail(myImage);
                // now save this image
             
                string guid = Guid.NewGuid().ToString();
                string fileName = guid + ".jpg";
                //create a memory stream ready for the rescaled image
                Stream outStream = new MemoryStream();
                
                myThumbnail.Save(outStream, System.Drawing.Imaging.ImageFormat.Jpeg);

                Console.WriteLine(
                    "Length = {0}, Position = {1}\n",
                    outStream.Length.ToString(),
                    outStream.Position.ToString());

                outStream.Position = 0;
                Azure.Response<BlobContentInfo> blobs = containerClient.UploadBlob(fileName, outStream);

                Console.WriteLine("blobs RETURN OBJECT: " + blobs.ToString());
                Console.WriteLine("blobs GetRawResponse: " + blobs.GetRawResponse());
                
                Console.ReadKey();

【问题讨论】:

  • 我很好奇这样的ID长什么样子。除了路径之外,Blob 没有专用的 id,我认为它是电源应用程序生成的东西或其他东西。您可以发布示例内容吗?另见stackoverflow.com/questions/63984830/…
  • @PeterBons - 我已将详细信息添加到原始问题中。
  • @Dai - 这是我正在寻找的 C# 代码,而不是 PowerApps 的东西。 PowerApp 已经可以正常工作了,谢谢。

标签: c# azure asp.net-core-3.1


【解决方案1】:

当我将它从 Base64 解码然后转换为 UTF-8 时:

JTJmc2hpcmVibG9iY29udGFpbmVyJTJmNTk3MzQ4NGYtNGVhNy00NzJkLTkyMzQtYWIwNzM5NWNlOGRiLmpwZw==

我知道了:

%2fshireblobcontainer%2f5973484f-4ea7-472d-9234-ab07395ce8db.jpg

因此,您的“Blob ID”似乎是您传递给AzureBlobStorage.CreateFile 的第二个参数的 URL 编码字符串值的 UTF-8(或 7 位 ASCII?)表示的 Base64 编码表示.

这样做:

String powerAppsBlobId = @"JTJmc2hpcmVibG9iY29udGFpbmVyJTJmNTk3MzQ4NGYtNGVhNy00NzJkLTkyMzQtYWIwNzM5NWNlOGRiLmpwZw==";

Byte[] blobIdBytes = Convert.FromBase64String( powerAppsBlobId );

String urlEncodedBlobName = Encoding.UTF8.GetString( bytes );

String actualBlobName = Uri.UnescapeDataString( urlEncodedBlobName );

Console.WriteLine( actualBlobName )

然后这个程序会打印这个:

/shireblobcontainer/5973484f-4ea7-472d-9234-ab07395ce8db.jpg

【讨论】:

  • 你一针见血。所以我需要做的就是找到我的 ID,以“/shireblobcontainer/”+我的文件名开头,然后将其转换回 Base64。
  • 您需要在 使用 Base64 对其进行编码之前对其进行 UTF-8 编码。
【解决方案2】:

在发布我的第一个答案(使用 Base64 解码)I took a look at the documentation for the Azure Blob connector for PowerApps 后,我看到 BlobMetadata.Name 和/或 BlobMetadata.Path 值也应该包含完整的 blob 名称。

我不知道您为什么指向 Azure.Storage.Blobs.Models 的文档,因为它不供 PowerApps 使用。

因此,一个更好的主意是在您从 PowerApps 中上传 blob 时存储 Blob.MetadataPath 值,以便您的控制台应用程序可以访问它 - 以防 PowerApps 更改其生成这些 Base64 BlobIds 的“算法”(例如,它们可以包括 blob 版本日期+时间或共享访问签名)。

所以把你的代码改成这样:

 Set(
        gblSentBlob,
        AzureBlobStorage.CreateFile(
            Text(gblAzureFileContainer),
            GUID() & ".jpg",
            camControl.Photo
        )
    );
    If(
        !IsEmpty(gblSentBlob),
        Notify("Picture saved to Azure storage:" & gblSentBlob.DisplayName);
        UpdateContext({locFileName: gblSentBlob.DisplayName});
        UpdateContext({locAzureStorageID: Text(gblSentBlob.Id)});
        UpdateContext({locAzureStoragePath: Text(gblSentBlob.Path)}); // <--- Add this here
        UpdateContext({locSavedToAzure: true});

【讨论】:

  • 我不是在寻找 PowerApps 的答案。我的问题是关于控制台应用程序的 C# 代码。
  • @SimpleSimon 您的帖子并没有说您不能更改您的 PowerApps 代码 - 正如我在回答中提到的那样,如果您确实存储了 Path,这是最好的 PowerApps 代码中的值,因为无法保证 Id 始终是 URL 编码的 blob 名称的 Base64 编码的 UTF8
  • 是的,我创建的图像将显示在 PowerApp 中,它使用我提供的格式的 BlobID 来访问图像文件。
猜你喜欢
  • 2016-02-13
  • 2018-05-07
  • 2021-07-09
  • 2019-04-06
  • 2014-08-23
  • 2017-12-14
  • 2012-03-02
  • 2016-03-04
  • 2017-11-10
相关资源
最近更新 更多