Microsoft Azure: как создать подкаталог в контейнере больших двоичных объектов


98

Как создать подкаталог в контейнере больших двоичных объектов

например,

в моем контейнере больших двоичных объектов 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

Ответы:


139

Чтобы добавить к тому, что сказал Эгон, просто создайте свой большой двоичный объект с именем «folder / 1.txt», и он будет работать. Нет необходимости создавать каталог.


3
как вы фильтруете или достаете все эти файлы из "папки"?
— afr0

2
Это не работает для меня, говорит, что контейнеры не могут использовать ничего, кроме строчных букв, дефисов и цифр. То же самое для имен файлов
— Green_qaue

@Green_qaue вы должны использовать только строчные буквы и цифры для именования вашего контейнера / каталогов, и поэтому у вас есть ошибки.
— Сапан Гафури

1
он создает несколько каталогов с одной и той же папкой, я имею в виду, что каждый раз, когда я загружаю файл, он снова создает каталог с именем «папка». Есть ли какой-либо способ проверить, существует ли папка, чтобы не создавать ее?
— amal50

@SapanGhafuri, это неправда, вы можете создавать каталоги, содержащие символы верхнего регистра
— codah

36

На самом деле есть только один слой контейнеров. Вы можете виртуально создать «файловую систему», подобную многоуровневому хранилищу, но на самом деле все будет в одном слое, в контейнере, в котором оно находится.

Для создания виртуальной «файловой системы», такой как хранилище, у вас могут быть имена больших двоичных объектов, содержащие '/', чтобы вы могли делать все, что захотите, с тем, как вы храните. Кроме того, замечательно то, что вы можете искать blob-объект на виртуальном уровне, задавая частичную строку до символа '/'.

Эти две вещи, добавление '/' к пути и частичной строки для поиска, вместе создают виртуальное хранилище «файловой системы».


Вы можете поделиться образцом C #? blob.name является свойством только для чтения, поэтому мы не можем создать blob.Name с "/"
— ABB,

34

Есть комментарий @ afr0, в котором спрашивается, как фильтровать папки.

Есть два способа использовать GetDirectoryReferenceили перебирать капли контейнера и проверять тип. Код ниже находится на 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

2
Это хорошая информация, но отвечает ли она «Как создать подкаталог в контейнере больших двоичных объектов»?
— codah


6

Если вы используете Microsoft Azure Storage Explorer , есть кнопка «Новая папка», которая позволяет вам создать папку в контейнере. На самом деле это виртуальная папка:

введите описание изображения здесь


5

Вам не нужно создавать подкаталог. Просто создайте контейнер больших двоичных объектов и используйте имя файла, например имя файла переменной, как показано ниже:

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 выше, в хранилище больших двоичных объектов нет реального управления папками.

Вы можете добиться некоторых функций файловой системы, используя '/' в имени файла, но это имеет много ограничений (например, что произойдет, если вам нужно переименовать «папку»?).

Как правило, я бы сохранил свои файлы в контейнере как можно более плоскими , и мое приложение управляло бы любой структурой, которую я хочу предоставить конечным пользователям (например, управлять вложенной структурой папок в моей базе данных , иметь запись для каждого file, ссылаясь на большой двоичный объект с помощью имени контейнера и имени файла).


1

Возникла аналогичная проблема при попытке попробовать первое бессерверное приложение Azure Sample .
Вот информация о том, как я решил, удалив \ перед $ 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

-2

Вот как я это делаю в CoffeeScript на Node.JS:

blobService.createBlockBlobFromText 'containerName', (path + '$$$.$$$'), '', (err, result)->
    if err
        console.log 'failed to create path', err
    else
        console.log 'created path', path, result

4
Вопрос отмечен какC#
— Рафаэль Херсковичи

@Dementic Отсюда и упоминание CoffeeScript, который представляет собой просто JavaScript без всякой ерунды. Перенести на C # не должно быть слишком сложно, особенно по сравнению с принятым ответом, которого нет даже на языке программирования.
— Cees Timmerman
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.