Microsoft Azure: como criar subdiretório em um contêiner de blob

93

Como criar um subdiretório em um contêiner de blob

por exemplo,

no meu contêiner de blob http://veda.blob.core.windows.net/document/

Se eu armazenar alguns arquivos, será

http://veda.blob.core.windows.net/document/1.txt

http://veda.blob.core.windows.net/document/2.txt

Agora, como criar um subdiretório

http://veda.blob.core.windows.net/document/folder/

Para que eu possa armazenar arquivos

http://veda.blob.core.windows.net/document/folder/1.txt

veda
fonte

Respostas:

134

Para complementar o que Egon disse, basta criar seu blob chamado "folder / 1.txt" e ele funcionará. Não há necessidade de criar um diretório.

user94559
fonte
3
como você filtra ou obtém todos esses arquivos da "pasta"?
afr0
1
Isso não funciona para mim, diz que os contêineres não podem usar nada além de letras minúsculas, hifens, números. O mesmo para nomes de arquivo
Green_qaue
@Green_qaue você tem que usar apenas letras minúsculas e números para nomear seu container / diretórios e é por isso que você obteve erros.
Sapan Ghafuri
1
ele cria vários diretórios com a mesma pasta, quer dizer, cada vez que eu carrego um arquivo, ele cria um diretório chamado "pasta" novamente, existe algum método para verificar se a pasta existe, então não deveria criá-la?
amal50
@SapanGhafuri isso não é verdade, você pode criar diretórios contendo letras maiúsculas
codah 01 de
36

Na verdade, há apenas uma única camada de recipientes. Você pode criar virtualmente um "sistema de arquivos" como armazenamento em camadas, mas na realidade tudo estará em uma camada, o contêiner em que está.

Para criar um "sistema de arquivos" virtual como armazenamento, você pode ter nomes de blob que contenham uma '/' para que você possa fazer o que quiser com a maneira como armazena. Além disso, a grande coisa é que você pode pesquisar um blob em um nível virtual, dando uma string parcial, até um '/'.

Essas 2 coisas, adicionando uma '/' a um caminho e uma string parcial para pesquisa, juntas criam um armazenamento de "sistema de arquivos" virtual.

Egon
fonte
Você pode compartilhar um exemplo de C #? blob.O nome é uma propriedade somente leitura, portanto, não podemos criar um blob.Nome com "/"
ABB
34

Há um comentário de @ afr0 perguntando como filtrar as pastas.

Há duas maneiras de usar GetDirectoryReferenceou percorrer os blobs de contêineres e verificar o tipo. O código abaixo está em 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);
    }
}

leia isto para uma cobertura mais detalhada: http://www.codeproject.com/Articles/297052/Azure-Storage-Blobs-Service-Working-with-Directori

AntonB
fonte
1
Essa deve ser a resposta na data de hoje. +1
MickyD
1
É uma boa informação, mas responde 'Como criar subdiretório em um contêiner de blob'?
codah
19

No Portal do Azure, temos a opção abaixo durante o upload do arquivo:

insira a descrição da imagem aqui

Pritam
fonte
4

Você não precisa criar um subdiretório. Basta criar recipiente blob eo nome do arquivo uso como a variável de nome de arquivo como o código abaixo:

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
Khabir
fonte
2

Como @Egon mencionou acima, não há gerenciamento de pasta real no armazenamento BLOB.

Você pode obter alguns recursos de um sistema de arquivos usando '/' no nome do arquivo, mas isso tem muitas limitações (por exemplo, o que acontecerá se você precisar renomear uma "pasta"?).

Como regra geral, eu manteria meus arquivos o mais simples possível em um contêiner e faria meu aplicativo gerenciar qualquer estrutura que desejo expor aos usuários finais (por exemplo, gerenciar uma estrutura de pasta aninhada em meu banco de dados , ter um registro para cada , referenciando o BLOB usando o nome do contêiner e o nome do arquivo).

Assaf S.
fonte
1

Tive um problema semelhante ao tentar o primeiro aplicativo sem servidor de amostra do Azure .
Aqui está a informação de como resolvi removendo \ da frente de $ web.

Nota: $ web container foi criado automaticamente ao habilitar o site estático. Nunca vi $ root container em qualquer lugar.

//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
Nara
fonte
-1

Veja como eu faço isso no CoffeeScript no Node.JS:

blobService.createBlockBlobFromText 'containerName', (path + '$$$.$$$'), '', (err, result)->
    if err
        console.log 'failed to create path', err
    else
        console.log 'created path', path, result
Cees Timmerman
fonte
3
A pergunta está marcada comoC#
Rafael Herscovici
@Dementic Por isso mencionei CoffeeScript, que é apenas JavaScript sem o lixo. Não deve ser muito difícil portar para C #, especialmente em comparação com a resposta aceita que nem mesmo está em uma linguagem de programação.
Cees Timmerman