c# - Azure Blob 存储 - 上传 Blob 后如何获取 Blob 存储 ID?
问题描述
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数据库中。如何找到已保存项目的 ID。这是命令:
Azure.Response<BlobContentInfo> blobs = containerClient.UploadBlob(fileName, outStream);
我似乎无法在返回的对象中找到它
我的原始图片是使用 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();
解决方案
当我从 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
推荐阅读
- azure-devops - 如何在管道发布阶段使用环境功能
- c++ - 使用 C++ 中的可变参数模板为 Arduino 编写自定义 [s]printf
- javascript - 角进口管无法识别
- haskell - 从依赖类型中提取类型级值/在值级使用类型级绑定
- python - 在python中为离线算法存储大型数据集的有效方法
- git - 将分支合并到 master 和另一个分支的最佳方法是什么?
- r - org-babel 如何在作为 shell 输入的 R 代码的输出中去掉 [1]
- reactjs - ReactN 给我 undefined 然后我使用“useGlobal”并尝试获取状态
- jquery - 如何在模态引导程序 4 中加载 jQuery
- scheme - 函数返回“应用程序不是过程”错误而不是新列表