Начало работы с Хранилищем BLOB-объектов Azure с помощью языка F#
Хранилище BLOB-объектов Azure — это служба, в которой хранятся неструктурированные данные в облаке в виде объектов или BLOB-объектов. В хранилище BLOB-объектов могут храниться текстовые или двоичные данные любого типа, например документы, файлы мультимедиа или установщики приложений. Хранилище BLOB-объектов иногда также называют хранилищем объектов.
В этой статье показано, как выполнять распространенные задачи с помощью хранилища BLOB-объектов. Примеры написаны с помощью F# с помощью клиентской библиотеки служба хранилища Azure для .NET. Описанные задачи включают отправку, перечисление, скачивание и удаление больших двоичных объектов.
Общие сведения о хранилище BLOB-объектов см . в руководстве по .NET для хранилища BLOB-объектов.
Необходимые компоненты
Чтобы использовать это руководство, необходимо сначала создать учетную запись хранения Azure. Вам также нужен ключ доступа к хранилищу для этой учетной записи.
Создание скрипта F# и запуск интерактивного F#
Примеры из этой статьи можно использовать в приложении F# или скрипте F#. Чтобы создать скрипт F#, создайте файл с .fsx
расширением, например blobs.fsx
в среде разработки F#.
Выполнение скриптов
F# Interactive, dotnet fsi
можно запустить в интерактивном режиме или запустить его из командной строки для запуска скрипта. Синтаксис командной строки:
> dotnet fsi [options] [ script-file [arguments] ]
Добавление пакетов в скрипт
Затем используйте #r
nuget:package name
для установки Azure.Storage.Blobs
пакета и open
пространств имен. Например,
> #r "nuget: Azure.Storage.Blobs"
open Azure.Storage.Blobs
open Azure.Storage.Blobs.Models
open Azure.Storage.Blobs.Specialized
Добавление объявлений пространств имен
Добавьте в начало файла blobs.fsx
следующие инструкции open
:
open System
open System.IO
open Azure.Storage.Blobs // Namespace for Blob storage types
open Azure.Storage.Blobs.Models
open Azure.Storage.Blobs.Specialized
open System.Text
Получение строки подключения
Вам потребуется служба хранилища Azure строка подключения для этого руководства. Дополнительные сведения о строка подключения см. в разделе "Настройка строк служба хранилища Подключение ion".
В этом руководстве вы вводите строка подключения в скрипте, как показано ниже.
let storageConnString = "..." // fill this in from your storage account
Создание некоторых локальных фиктивных данных
Прежде чем начать, создайте некоторые фиктивные локальные данные в каталоге нашего скрипта. Позже вы отправите эти данные.
// Create a dummy file to upload
let localFile = "./myfile.txt"
File.WriteAllText(localFile, "some data")
Создание клиента службы BLOB-объектов
Тип BlobContainerClient
позволяет создавать контейнеры и извлекать большие двоичные объекты, хранящиеся в хранилище BLOB-объектов. Вот один из способов создания клиента контейнера:
let container = BlobContainerClient(storageConnString, "myContainer")
Теперь вы можете написать код, который считывает и записывает данные в хранилище BLOB-объектов.
Создание контейнера
В этом примере показано, как создать контейнер:
container.CreateIfNotExists()
По умолчанию новый контейнер является закрытым. Это значит, что вам нужно указать ключ доступа к хранилищу, чтобы загрузить большие двоичные объекты из этого контейнера. Чтобы сделать файлы в этом контейнере доступными для всех пользователей, сделайте контейнер открытым, используя следующий код:
let permissions = PublicAccessType.Blob
container.SetAccessPolicy(permissions)
Любой пользователь в Интернете может видеть большие двоичные объекты в открытом контейнере, но изменить или удалить их можно только при наличии ключа доступа или подписанного URL-адреса.
Отправка BLOB-объекта в контейнер
Хранилище BLOB-объектов Azure поддерживает блочные и страничные BLOB-объекты. В большинстве случаев блочный большой двоичный объект является рекомендуемым типом.
Чтобы отправить файл в блочный BLOB-объект, получите клиент контейнера и используйте его для получения ссылки на блочный BLOB-объект. Получив ссылку на большой двоичный объект, вы можете передать в него любой поток данных, вызвав Upload
метод. Эта операция перезаписывает содержимое большого двоичного объекта, создавая новый блочный большой двоичный объект, если он отсутствует.
// Retrieve reference to a blob named "myblob.txt".
let blockBlob = container.GetBlobClient("myblob.txt")
// Create or overwrite the "myblob.txt" blob with contents from the local file.
use fileStream = new FileStream(localFile, FileMode.Open, FileAccess.Read, FileShare.Read)
do blockBlob.Upload(fileStream)
Перечисление BLOB-объектов в контейнере
Для перечисления BLOB-объектов в контейнере сначала необходимо получить ссылку на контейнер. Затем можно использовать метод контейнера GetBlobs
для получения больших двоичных объектов и (или) каталогов в нем. Чтобы получить доступ к богатому набору свойств и методов для возвращаемого BlobItem
объекта.
for item in container.GetBlobsByHierarchy() do
printfn $"Blob name: {item.Blob.Name}"
Например, рассмотрим следующий набор блочных BLOB-объектов в контейнере с именем photos
:
photo1.jpg
2015/architecture/description.txt
2015/architecture/photo3.jpg
2015/architecture/photo4.jpg
2016/architecture/photo5.jpg
2016/architecture/photo6.jpg
2016/архитектура/description.txt
2016/photo7.jpg\
При вызове GetBlobsByHierarchy
контейнера (как показано в приведенном выше примере), возвращается иерархическое описание.
Directory: https://<accountname>.blob.core.windows.net/photos/2015/
Directory: https://<accountname>.blob.core.windows.net/photos/2016/
Block blob of length 505623: https://<accountname>.blob.core.windows.net/photos/photo1.jpg
скачивание больших двоичных объектов;
Чтобы скачать большие двоичные объекты, сначала получите ссылку на большой двоичный объект, а затем вызовите DownloadTo
метод. В следующем примере метод используется DownloadTo
для передачи содержимого большого двоичного объекта в объект потока, который затем можно сохранить в локальном файле.
// Retrieve reference to a blob named "myblob.txt".
let blobToDownload = container.GetBlobClient("myblob.txt")
// Save blob contents to a file.
do
use fileStream = File.OpenWrite("path/download.txt")
blobToDownload.DownloadTo(fileStream)
Можно также использовать DownloadContent
метод для скачивания содержимого большого двоичного объекта в виде текстовой строки.
let text = blobToDownload.DownloadContent().Value.Content.ToString()
удаление больших двоичных объектов.
Чтобы удалить большой двоичный объект, сначала получите ссылку на большой двоичный объект, а затем вызовите Delete
метод.
// Retrieve reference to a blob named "myblob.txt".
let blobToDelete = container.GetBlobClient("myblob.txt")
// Delete the blob.
blobToDelete.Delete()
Асинхронное перечисление BLOB-объектов в страницах
Если вам нужно расположить большое количество BLOB-объектов или вы хотите управлять отображением количества объектов в результате запроса, вы можете задать расположение BLOB-объектов на странице. В этом примере показано, как возвращать результаты на страницах.
В этом примере показан иерархический список с помощью GetBlobsByHierarchy
метода BlobClient
.
let ListBlobsSegmentedInHierarchicalListing(container:BlobContainerClient) =
// List blobs to the console window, with paging.
printfn "List blobs in pages:"
// Call GetBlobsByHierarchy to return an async collection
// of blobs in this container. AsPages() method enumerate the values
//a Page<T> at a time. This may make multiple service requests.
for page in container.GetBlobsByHierarchy().AsPages() do
for blobHierarchyItem in page.Values do
printf $"The BlobItem is : {blobHierarchyItem.Blob.Name} "
printfn ""
Теперь мы можем использовать эту подпрограмму иерархического перечисления, как показано ниже. Сначала отправьте некоторые фиктивные данные (используя локальный файл, созданный ранее в этом руководстве).
for i in 1 .. 100 do
let blob = container.GetBlobClient($"myblob{i}.txt")
use fileStream = System.IO.File.OpenRead(localFile)
blob.Upload(localFile)
Теперь вызовите подпрограмму.
ListBlobsSegmentedInHierarchicalListing container
Запись в расширенный большой двоичный объект
Добавочный большой двоичный объект оптимизирован для операций добавления, например ведения журналов. Как и блочный BLOB-объект, добавочный большой двоичный объект состоит из блоков, но при добавлении нового блока в дополнительный большой двоичный объект всегда добавляется в конец большого двоичного объекта. Вы не можете обновить или удалить существующий блок в добавочном большом двоичном объекте. Идентификаторы блоков в добавочном большом двоичном объекте не отображаются, как в блочном BLOB-объекте.
Каждый блок в добавочном большом двоичном объекте может иметь разный размер (не более 4 МБ), кроме того, добавочный большой двоичный объект может содержать не более 50 000 блоков. Таким образом, максимальный размер добавочного большого двоичного объекта немного превышает 195 ГБ (4 МБ X 50 000 блоков).
В следующем примере создается новый большой двоичный объект и добавляется к нему некоторые данные, имитация простой операции ведения журнала.
// Get a reference to a container.
let appendContainer = BlobContainerClient(storageConnString, "my-append-blobs")
// Create the container if it does not already exist.
appendContainer.CreateIfNotExists() |> ignore
// Get a reference to an append blob.
let appendBlob = appendContainer.GetAppendBlobClient("append-blob.log")
// Create the append blob. Note that if the blob already exists, the
// CreateOrReplace() method will overwrite it. You can check whether the
// blob exists to avoid overwriting it by using CloudAppendBlob.Exists().
appendBlob.CreateIfNotExists()
let numBlocks = 10
// Generate an array of random bytes.
let rnd = Random()
let bytesArray = Array.zeroCreate<byte>(numBlocks)
rnd.NextBytes(bytesArray)
// Simulate a logging operation by writing text data and byte data to the
// end of the append blob.
for i in 0 .. numBlocks - 1 do
let msg = sprintf $"Timestamp: {DateTime.UtcNow} \tLog Entry: {bytesArray.[i]}\n"
let array = Encoding.ASCII.GetBytes(msg);
use stream = new MemoryStream(array)
appendBlob.AppendBlock(stream)
// Read the append blob to the console window.
let downloadedText = appendBlob.DownloadContent().ToString()
printfn $"{downloadedText}"
Дополнительные сведения о различиях между тремя типами больших двоичных объектов см. в статье Основные сведения о блочных, страничных и добавочных BLOB-объектах.
Одновременный доступ
Чтобы реализовать одновременный доступ нескольких клиентов или экземпляров процесса к BLOB-объекту, можно использовать ETags или lease.
Etag — позволяет обнаружить, что BLOB-объект или контейнер были изменены другим процессом
Аренда — предоставляет способ получения монопольного, возобновляемых источников, записи или удаления доступа к большому двоичному объекту в течение определенного периода времени
Дополнительные сведения см. в разделе "Управление параллелизмом в служба хранилища Microsoft Azure".
Именование контейнеров
Каждый BLOB-объект в Azure должен располагаться в контейнере. Контейнер составляет часть имени BLOB-объекта. Например, mydata
— имя контейнера в таких взятых в качестве образца URI BLOB-объектов:
https://storagesample.blob.core.windows.net/mydata/blob1.txt
https://storagesample.blob.core.windows.net/mydata/photos/myphoto.jpg
Имя контейнера должно быть допустимым DNS-именем и соответствовать указанным ниже правилам именования.
- Имена контейнеров должны начинаться с буквы или цифры и могут содержать только буквы, цифры и тире (-).
- Каждое тире (-) должно стоять непосредственно перед буквой или цифрой и после нее. В именах контейнеров запрещено использовать несколько тире подряд.
- Все знаки в имени контейнера должны быть строчными.
- Имя контейнера должно содержать от 3 до 63 знаков.
Имя контейнера всегда должно быть строчным регистром. При использовании заглавных букв в имени контейнера или другом нарушении правил именования контейнера может появиться ошибка 400 (Ошибка запроса).
Управление системой безопасности больших двоичных объектов
По умолчанию служба хранилища Azure защищает данные, ограничивая доступ к учетной записи пользователя, который владеет ключами доступа к учетной записи. Если вы хотите предоставить доступ к данным больших двоичных объектов в своей учетной записи хранения, важно сделать это без ущерба для безопасности ключей доступа к учетной записи. Кроме того, вы можете зашифровать данные больших двоичных объектов, чтобы обеспечить их безопасную отправку по сети в службу хранилища Azure.
Управление доступом к данным больших двоичных объектов
По умолчанию данные больших двоичных объектов в учетной записи хранения доступны только владельцу учетной записи хранения. По умолчанию для проверки подлинности запросов к хранилищу BLOB-объектов требуется ключ доступа к учетной записи. Однако может потребоваться сделать некоторые данные BLOB-объектов доступными для других пользователей.
Шифрование данных больших двоичных объектов
служба хранилища Azure поддерживает шифрование данных BLOB-объектов как на клиенте, так и на сервере.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по