Microsoft Azure:如何在 blob 容器中创建子目录

Posted

技术标签:

【中文标题】Microsoft Azure:如何在 blob 容器中创建子目录【英文标题】:Microsoft Azure: How to create sub directory in a blob container 【发布时间】:2011-02-06 19:42:24 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

你能分享 C# 示例吗? blob.The name 是只读属性,因此我们无法使用“/”创建 blob.Name【参考方案2】:

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

【讨论】:

你如何从“文件夹”中过滤或获取所有这些文件? 这对我不起作用,说容器只能使用小写字母、连字符、数字。文件名相同 @Green_qaue 您只能使用小写字母和数字来命名您的容器/目录,这就是您出错的原因。 它用同一个文件夹创建了几个目录,我的意思是每次我上传文件时,它都会再次创建一个名为“文件夹”的目录,有什么方法可以检查文件夹是否存在所以它不应该创建它? @SapanGhafuri 这不是真的,您可以创建包含大写字符的目录【参考方案3】:

@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 这是很好的信息,但它是否回答了“如何在 blob 容器中创建子目录”? 警告:这是针对过时的 NuGet 包...【参考方案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

【讨论】:

问题标记为C# @Dementic 因此我提到了 CoffeeScript,它只是没有繁琐的 javascript。移植到 C# 应该不会太难,尤其是与甚至不是编程语言的公认答案相比。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

【参考方案8】:

在尝试 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

【讨论】:

【参考方案9】:

您不需要创建sub directory。只需创建 blob container 并使用像变量 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

【讨论】:

【参考方案10】:

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

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

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

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

【讨论】:

【参考方案11】:

我需要从 Jenkins 管道执行此操作,因此需要将文件上传到特定文件夹名称,而不是根容器文件夹。我使用 --destination-path 可以是 folderfolder1/folder2

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

希望对某人有所帮助

【讨论】:

【参考方案12】:

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

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

【讨论】:

以上是关于Microsoft Azure:如何在 blob 容器中创建子目录的主要内容,如果未能解决你的问题,请参考以下文章

Azure.Cosmos 还是 Microsoft.Azure.Cosmos、Azure.Storage.Blob 还是 Microsoft.Azure.Storage.Blob?适用于 .NET C

如何把文件上传的Microsoft Azure的Blob存储

将 Microsoft 无状态服务绑定到 Azure 存储 Blob?

如何用 Microsoft.Azure.Storage.Blob 替换 Microsoft.WindowsAzure.Storage

必须如何存储 Azure Blob 存储连接数据才能支持所有可用的寻址模式?

如何备份 Azure 表和 Blob