簡體   English   中英

Microsoft Azure:如何在 blob 容器中創建子目錄

[英]Microsoft Azure: How to create sub directory in a blob container

如何在 blob 容器中創建子目錄

例如,

在我的 blob 容器中http://veda.blob.core.windows.net/document/

如果我存儲一些文件,它將是

http://veda.blob.core.windows.net/document/1.txt

http://veda.blob.core.windows.net/document/2.txt

現在,如何創建子目錄

http://veda.blob.core.windows.net/document/folder/

這樣我就可以存儲文件

http://veda.blob.core.windows.net/document/folder/1.txt

要補充 Egon 所說的內容,只需創建名為“folder/1.txt”的 blob,它就會起作用。 無需創建目錄。

實際上只有一層容器。 您可以虛擬地創建類似於分層存儲的“文件系統”,但實際上一切都將在 1 層中,即它所在的容器。

為了創建像存儲這樣的虛擬“文件系統”,您可以使用包含“/”的 blob 名稱,以便您可以按照您的存儲方式執行任何您喜歡的操作。 此外,最棒的是您可以在虛擬級別搜索 blob,方法是提供部分字符串,最多為“/”。

這兩件事,將“/”添加到路徑和用於搜索的部分字符串,共同創建了一個虛擬的“文件系統”存儲。

@afr0 有一條評論詢問如何過濾文件夾..

有兩種方法可以使用GetDirectoryReference或循環遍歷容器 blob 並檢查類型。 下面的代碼是在 C#

CloudBlobContainer container = blobClient.GetContainerReference("photos");

//Method 1. grab a folder reference directly from the container
CloudBlobDirectory folder = container.GetDirectoryReference("directoryName");

//Method 2. Loop over container and grab folders.
foreach (IListBlobItem item in container.ListBlobs(null, false))
{
    if (item.GetType() == typeof(CloudBlobDirectory))
    {
        // we know this is a sub directory now
        CloudBlobDirectory subFolder = (CloudBlobDirectory)item;

        Console.WriteLine("Directory: {0}", subFolder.Uri);
    }
}

閱讀本文以獲得更深入的報道: http : //www.codeproject.com/Articles/297052/Azure-Storage-Blobs-Service-Working-with-Directori

在 Azure 門戶中,我們在上傳文件時有以下選項:

在此處輸入圖片說明

如果您使用Microsoft Azure 存儲資源管理器,則有一個“新建文件夾”按鈕可讓您在容器中創建文件夾。 這實際上是一個虛擬文件夾:

在此處輸入圖片說明

您不需要創建子目錄。 只需創建 blob 容器並使用文件名,如變量文件名,如下代碼:

string filename = "document/tech/user-guide.pdf";
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlockBlob blob = cloudBlobContainer.GetBlockBlobReference(filename);
blob.StreamWriteSizeInBytes = 20 * 1024;
blob.UploadFromStream(fileStream); // fileStream is System.IO.Stream

對於那些在動態目錄中苦苦掙扎的人
根據版本 12

<PackageReference Include="Azure.Storage.Blobs" Version="12.10.0"/>

您可以輕松地使用反斜杠分隔目錄或文件夾路徑。 在這種情況下,它們將自動創建。 例子:

public async Task UploadFile(string env, string filePath, string filename, Guid companyId, Guid assetId, string baseKey)
{
    var blobContainer = blobServiceClient.GetBlobContainerClient("graphs-data");
    if (!blobContainer.Exists())
    {
      blobContainer.Create();
    }
    var blobClient = blobContainer.GetBlobClient($"input/{env}/{companyId}/iotasset/{assetId}/{baseKey}/{filename}");
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
      await blobClient.UploadAsync(fs, overwrite: true);
}

Azure 存儲資源管理器中的結果視圖上傳的四個文本文件

正如@Egon 上面提到的,BLOB 存儲中沒有真正的文件夾管理。

您可以使用文件名中的“/”來實現文件系統的某些功能,但這有很多限制(例如,如果您需要重命名“文件夾”會發生什么?)。

作為一般規則,我會將我的文件盡可能地保持在容器中,並讓我的應用程序管理我想要向最終用戶公開的任何結構(例如管理我的數據庫中的嵌套文件夾結構為每個文件,使用容器名和文件名引用 BLOB)。

想添加 UI 門戶方式也可以。 如果要創建文件夾結構,則必須使用每個文件的完整路徑。

在此處輸入圖片說明

您需要單擊“上傳 Blob”,展開“高級”並將其放在“上傳到文件夾”的路徑中

假設您有一個要上傳的文件夾資產,文件夾的內容如下所示

在此處輸入圖片說明

如果你在js文件夾下有一個名為main.js的文件夾,你需要在上傳到文件夾中輸入路徑“assets/js”。 現在這必須為每個文件完成。 如果您有很多文件,建議您以編程方式進行。

嘗試 Azure Sample first-serverless-app 時遇到類似問題。
這是我如何通過刪除 $web 前面的 \\ 來解決的信息。

注意:$web 容器是在啟用靜態網站時自動創建的。 從未在任何地方見過 $root 容器。

//getting Invalid URI error while following tutorial as-is
az storage blob upload-batch -s . -d \$web --account-name firststgaccount01

//Remove "\" @destination param
az storage blob upload-batch -s . -d $web --account-name firststgaccount01

我需要從 Jenkins 管道執行此操作,因此,需要將文件上傳到特定文件夾名稱而不是根容器文件夾。 我使用 --destination-path 可以是文件夾文件夾 1 /文件夾 2

az storage blob upload-batch --account-name $AZURE_STORAGE_ACCOUNT --destination ${CONTAINER_NAME} --destination-path ${VERSION_FOLDER} --source ${BUILD_FOLDER} --account-key $ACCESS_KEY

希望這對某人有幫助

沒有直接選項來創建文件夾/目錄。 但是,如果您希望將某些內容上傳到文件夾,那么在上傳文件時您需要在高級部分下傳遞文件夾名稱。 例如,如果我想將圖像上傳到名為文件夾的資產,那么我的上傳窗口將如下所示。 在此處輸入圖片說明

這將創建一個文件夾名稱資產並將文件上傳到該文件夾​​。 需要注意的是文件夾名和文件名是區分大小寫的。

使用 Python 查看此功能的視頻演示: https://youtu.be/Bnrargw-eM0

C#而不是上面接受的英文:

CloudBlobContainer container = new CloudBlobContainer(new Uri(sasUri));
CloudBlockBlob blob = container.GetBlockBlobReference(filePathInSyncFolder);
LocalFileSysAccess.LocalFileSys uploadfromFile = new LocalFileSysAccess.LocalFileSys();
uploadfromFile.uploadfromFilesystem(blob, localFilePath, eventType);

在我看來,Node.JS 上的 CoffeeScript 更簡單:

blobService.createBlockBlobFromText 'containerName', (path + '$$$.$$$'), '', (err, result)->
    if err
        console.log 'failed to create path', err
    else
        console.log 'created path', path, result

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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