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


93

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

Answers:


134

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


3
如何从“文件夹”过滤或获取所有这些文件?
afr0

1
这对我不起作用,表示容器只能使用小写字母,连字符和数字。文件名相同
Green_qaue

@Green_qaue您只需要使用小写字母和数字来命名您的容器/目录,这就是为什么会出现错误的原因。
Sapan Ghafuri

1
它会创建具有相同文件夹的多个目录,我的意思是每次上传文件时,它都会再次创建一个名为“文件夹”的目录,是否有任何方法可以检查文件夹是否存在,所以不应该创建该文件夹?
amal50 '18年

@SapanGhafuri这不是正确的,您可以创建包含大写字母的目录
柯达

36

实际上只有一层容器。您实际上可以创建类似于分层存储的“文件系统”,但实际上所有内容都将位于1层(即其中的容器)中。

对于创建像存储这样的虚拟“文件系统”,您可以使用包含'/'的blob名称,以便您可以按照自己喜欢的方式进行存储。同样,很棒的是,您可以通过提供部分字符串(最多以'/'开头)在虚拟级别上搜索blob。

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


可以共享C#示例吗?blob.name是只读属性,因此我们无法创建带有“ /”的blob.Name
ABB

34

@ 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
MickyD

1
这是个很好的信息,但是它会回答“如何在Blob容器中创建子目录”吗?
哥打

19

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

在此处输入图片说明



4

您不需要创建子目录。只需创建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

2

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

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

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


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

-1

这是我在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

3
问题被标记为C#
拉斐尔·赫斯科维奇

@Dementic因此,我提到了CoffeeScript,它只是JavaScript,没有内容。移植到C#并不难,特别是与甚至没有编程语言的公认答案相比。
Cees Timmerman '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.