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.