127

如何在 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

4

13 回答 13

160

要补充 Egon 所说的内容,只需创建名为“folder/1.txt”的 blob,它就会起作用。无需创建目录。

于 2010-04-12T18:34:08.710 回答
47

实际上只有一层容器。您可以虚拟地创建像分层存储一样的“文件系统”,但实际上所有内容都将位于 1 层,即它所在的容器中。

为了创建像存储这样的虚拟“文件系统”,您可以使用包含“/”的 blob 名称,这样您就可以使用您的存储方式做任何您喜欢的事情。此外,最棒的是,您可以在虚拟级别搜索 blob,方法是提供部分字符串,最多为 '/'。

这两件事,将“/”添加到路径和用于搜索的部分字符串,共同创建了一个虚拟的“文件系统”存储。

于 2010-04-11T23:21:14.263 回答
38

@afr0 有一条评论询问如何过滤文件夹..

有两种方法使用GetDirectoryReferenceor 循环容器 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

于 2016-01-04T23:43:09.580 回答
28

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

在此处输入图像描述

于 2017-11-08T06:32:29.063 回答
8

您不需要创建sub directory. 只需创建blob container和使用文件名,如变量文件名,如下代码:

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
于 2019-06-22T19:09:02.767 回答
6

如果您使用Microsoft Azure 存储资源管理器,则有一个“新建文件夹”按钮,可让您在容器中创建文件夹。这实际上是一个虚拟文件夹:

在此处输入图像描述

于 2017-05-15T09:40:28.480 回答
3

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

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

作为一般规则,我会在容器中尽可能保持文件平坦,并让我的应用程序管理我想向最终用户公开的任何结构(例如管理我的数据库中的嵌套文件夹结构,为每个文件,使用容器名和文件名引用 BLOB)。

于 2018-06-06T08:49:06.557 回答
3

想添加 UI 门户的方式也是如此。如果要创建文件夹结构,则必须使用每个文件的完整路径来完成。

在此处输入图像描述

您需要单击上传 Blob,展开高级并将其放在“上传到文件夹”的路径中

因此,假设您有一个要上传的文件夹资产,该文件夹的内容如下所示

在此处输入图像描述

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

于 2020-12-03T13:37:27.653 回答
1

尝试 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
于 2018-07-01T04:20:28.167 回答
0

对于在动态目录中苦苦挣扎的
人根据版本 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 存储资源管理器中的结果视图 上传的四个文本文件

于 2022-03-01T12:32:52.263 回答
0

没有创建文件夹/目录的直接选项。但是,如果您想将某些内容上传到文件夹,那么在上传文件时,您需要在高级部分下传递文件夹名称。例如,如果我想将图像上传到名为文件夹的资产,那么我的上传窗口将如下所示。在此处输入图像描述

这将创建一个文件夹名称资产并将文件上传到该文件夹​​。需要注意的是文件夹名和文件名区分大小写。

于 2021-10-07T12:13:45.640 回答
0

我需要从 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

希望这对某人有帮助

于 2021-02-17T22:24:30.043 回答
-4

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
于 2016-02-19T14:53:25.970 回答