微软Azure: 如何在Blob容器中创建子目录

161

现在这个术语被称为“虚拟目录”,您可以在此处了解相关信息:https://learn.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#blob-names - Jorge Orpinel Pérez
13个回答

193

补充一下Egon所说的内容,只需创建名为"folder/1.txt"的blob即可,无需创建目录。


7
你如何从“文件夹”中筛选或获取所有这些文件? - afr0
3
无法使用,容器只能使用小写字母、连字符和数字。文件名同理。 - Green_qaue
@Green_qaue,你必须仅使用小写字母和数字来命名你的容器/目录,这就是为什么你会遇到错误的原因。 - Sapan Ghafuri
1
它会创建几个具有相同文件夹的目录,我的意思是每次上传文件时,它都会再次创建名为“folder”的目录,是否有任何方法可以检查文件夹是否存在,以便不必创建它? - amal50
@SapanGhafuri 这不是真的,你可以创建包含大写字符的目录。 - codah
当通过Azure UI上传时,“/”会被转换为“:”,因此似乎无法正常工作。 - Rick

56

实际上只有一个容器层级。您可以虚拟创建类似“文件系统”的分层存储,但实际上所有内容都将在一个层级中,即它所在的容器中。

为了创建虚拟的“文件系统”存储,您可以使用包含“/”的blob名称,这样您可以以任何希望的方式进行存储。另外,很棒的一点是,您可以通过提供部分字符串(最多到“/”),在虚拟层面上搜索blob。

这两个功能——将路径添加“/”和部分字符串搜索——共同创建了虚拟的“文件系统”存储。


你能分享一个C#的示例吗?blob的名称是只读属性,所以我们无法创建一个带有“/”的blob.Name。 - Ashutosh B Bodake

39

@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


1
这应该是截至今天日期的答案。+1 - user585968
3
这是个不错的信息,但它回答了“如何在 Blob 容器中创建子目录”吗? - codah
2
警告:此为已过时的NuGet包... - Saibamen

39
在 Azure 门户中上传文件时,我们有以下选项:

enter image description here


10
如果您使用 Microsoft Azure Storage Explorer,那么您会看到一个“新建文件夹”的按钮,可以让您在容器中创建一个文件夹。实际上,这是一个虚拟文件夹。

enter image description here


9
您不需要创建子目录。只需创建blob容器,并使用以下代码中的变量filename作为文件名:
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

5

对于那些面临动态目录问题的人
根据版本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存储资源管理器中查看结果视图。 已上传的四个文本文件

使用最新版本时非常简单! - Quiver

4

我想添加UI界面来实现。 如果您想创建文件夹结构,您需要为每个文件使用完整路径。

enter image description here

你需要点击“上传 Blob”,展开“高级选项”并将路径设置为“上传至文件夹”。
假设你有一个名为 assets 的文件夹要上传,该文件夹的内容如下:

enter image description here

如果您在js文件夹下有一个名为main.js的文件夹,您需要在上传到文件夹中输入路径“assets/js”。 现在每个文件都必须这样做。如果您有很多文件,建议您以编程方式完成。

3

正如 @Egon 上面提到的,BLOB存储中没有真正的文件夹管理。

使用文件名中的 '/' 可以实现一些文件系统的功能,但这有许多限制(例如,如果您需要重命名一个“文件夹”会发生什么?)。

一般来说,我会尽可能地将我的文件 保存在容器中,并让我的应用程序管理我想向最终用户公开的任何结构(例如,在我的数据库中管理嵌套的文件夹结构,为每个文件创建一条记录,引用使用容器名称和文件名的 BLOB )。


1

在尝试 Azure 示例 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接