Microsoft Azure: cómo crear un subdirectorio en un contenedor de blobs

97

Cómo crear un subdirectorio en un contenedor de blobs

por ejemplo,

en mi contenedor de blobs http://veda.blob.core.windows.net/document/

Si guardo algunos archivos, será

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

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

Ahora, cómo crear un subdirectorio

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

Para que pueda almacenar archivos

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

veda
fuente

Respuestas:

138

Para agregar a lo que dijo Egon, simplemente cree su blob llamado "carpeta / 1.txt", y funcionará. No es necesario crear un directorio.

user94559
fuente
3
¿Cómo filtrar u obtener todos estos archivos de la "carpeta"?
2015
2
Esto no funciona para mí, dice que los contenedores no pueden usar nada más que minúsculas, guiones, números. Lo mismo para los nombres de archivo
Green_qaue
@Green_qaue tienes que usar solo letras minúsculas y números para nombrar tus contenedores / directorios y es por eso que tienes errores.
Sapan Ghafuri
1
crea varios directorios con la misma carpeta, es decir, cada vez que subo un archivo, vuelve a crear un directorio llamado "carpeta", ¿hay algún método para verificar si la carpeta existe, por lo que no debería crearla?
amal50
@SapanGhafuri esto no es cierto, puede crear directorios que contengan caracteres en mayúsculas
codah
36

En realidad, solo hay una capa de contenedores. Puede crear virtualmente un "sistema de archivos" como almacenamiento en capas, pero en realidad todo estará en 1 capa, el contenedor en el que se encuentra.

Para crear un almacenamiento virtual como un "sistema de archivos", puede tener nombres de blobs que contengan una '/' para que pueda hacer lo que quiera con la forma en que almacena. Además, lo mejor es que puede buscar un blob a nivel virtual, dando una cadena parcial, hasta una '/'.

Estas 2 cosas, agregando una '/' a una ruta y una cadena parcial para la búsqueda, juntas crean un almacenamiento virtual de "sistema de archivos".

Egon
fuente
¿Puede compartir la muestra de C #? blob. El nombre es una propiedad de solo lectura, por lo que no podemos crear un blob. Nombre con "/"
ABB
34

Hay un comentario de @ afr0 que pregunta cómo filtrar por carpetas.

Hay dos formas de utilizar GetDirectoryReferenceo recorrer un contenedor de blobs y comprobar el tipo. El siguiente código está en 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);
    }
}

lea esto para obtener una cobertura más detallada: http://www.codeproject.com/Articles/297052/Azure-Storage-Blobs-Service-Working-with-Directori

AntonB
fuente
1
Esta debería ser la respuesta a la fecha de hoy. +1
MickyD
2
Es buena información, pero ¿responde 'Cómo crear un subdirectorio en un contenedor de blobs'?
codah
20

En Azure Portal tenemos la siguiente opción al cargar el archivo:

ingrese la descripción de la imagen aquí

Pritam
fuente
5

No es necesario crear un subdirectorio. Simplemente cree un contenedor de blobs y use el nombre de archivo como el nombre de archivo variable como el siguiente código:

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
fuente
2

Como @Egon mencionó anteriormente, no existe una administración de carpetas real en el almacenamiento BLOB.

Puede lograr algunas características de un sistema de archivos usando '/' en el nombre del archivo, pero esto tiene muchas limitaciones (por ejemplo, ¿qué sucede si necesita cambiar el nombre de una "carpeta"?).

Como regla general, mantendría mis archivos lo más planos posible en un contenedor y haría que mi aplicación administrara cualquier estructura que desee exponer a los usuarios finales (por ejemplo, administrar una estructura de carpetas anidadas en mi base de datos , tener un registro para cada file, haciendo referencia al BLOB usando el nombre del contenedor y el nombre del archivo).

Assaf S.
fuente
1

Obtuve un problema similar al probar la primera aplicación sin servidor de Azure Sample .
Aquí está la información de cómo resolví eliminando \ al frente de $ web.

Nota: $ web container se creó automáticamente mientras se habilitaba el sitio web estático. Nunca he visto $ contenedor de raíz en ningún lado.

//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
fuente
-2

Así es como lo hago en CoffeeScript en 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
fuente
4
La pregunta está etiquetada comoC#
Rafael Herscovici
@Dementic De ahí mi mención de CoffeeScript, que es solo JavaScript sin el cruft. No debería ser demasiado difícil migrar a C #, especialmente en comparación con la respuesta aceptada que ni siquiera está en un lenguaje de programación.
Cees Timmerman