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 可以是 folder 或 folder1/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