[英]Azure Blob Storage - how do I get the Blob Storage ID after uploading a blob?
我正在使用 C# 控制台應用程序 (.NET Core 3.1) 從 Azure Blob 存儲讀取圖像文件的負載並生成這些圖像的縮略圖。 新圖像將保存回 Azure,並將 Blob ID 存儲在我們的數據庫中。 如何找到已保存項目的 ID。 這是命令:
Azure.Response<BlobContentInfo> blobs = containerClient.UploadBlob(fileName, outStream);
我似乎在返回的 object 中找不到它
我的原始圖片是使用 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 function 返回一個 object,其中包含我要查找的 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
在發布了我的第一個答案(使用Base64
解碼)后,我查看了 PowerApps 的 Azure Blob 連接器的文檔,我發現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});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.