簡體   English   中英

Azure Blob 存儲 - 上傳 Blob 后如何獲取 Blob 存儲 ID?

[英]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 中找不到它

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 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM