Упражнение. Отправка и скачивание BLOB-объектов

Завершено

Для взаимодействия с отдельными BLOB-объектами в Хранилище BLOB-объектов используется объект BlobClient. Вы получаете BlobClient путем его запроса по имени BLOB-объекта из BlobContainerClient, в котором находится большой двоичный объект. BlobClient содержит методы для отправки и скачивания отдельных больших двоичных объектов и управления ими в Хранилище BLOB-объектов.

Получение объекта BlobClient

Чтобы получить BlobClient по имени, вызовите методы GetBlobClient в BlobContainerClient, где содержится большой двоичный объект с этим именем. Объект BlobClient позволяет взаимодействовать с большим двоичным объектом, который отправляет, скачивает или управляет большим двоичным объектом в Хранилище BLOB-объектов.

Перемещение данных в BLOB-объект или из него является сетевой операцией и требует времени. Пакет SDK для службы хранилища Azure для .NET предоставляет асинхронную реализацию всех методов, которым требуется сетевая активность. Рекомендуется использовать эти асинхронные реализации, когда это возможно в приложении.

Мы рекомендуем использовать потоки вместо структур в памяти, таких как массивы байтов или строки при работе с большими объектами данных. Этот подход позволяет избежать буферизации полного содержимого в памяти перед отправкой его в целевой объект. ASP.NET Core поддерживает считывание потоков из запросов и ответов и запись потоков в них.

Чтобы получить BlobClient по имени, вызовите методы getBlobClient в BlobContainerClient, где содержится большой двоичный объект с этим именем. Объект BlobClient позволяет взаимодействовать с большим двоичным объектом, который отправляет, скачивает или управляет большим двоичным объектом в Хранилище BLOB-объектов.

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

Создание новых больших двоичных объектов

Чтобы создать новый BLOB-объект, вызовите один из методов Upload для BLOB-объекта, который не существует в хранилище. Этот подход выполняет два действия: создает большой двоичный объект в хранилище и отправляет данные.

BlobClient blobClient = containerClient.GetBlobClient(name);

var response = blobClient.UploadAsync(fileStream);

Чтобы создать новый BLOB-объект, вызовите один из методов upload для BLOB-объекта, который не существует в хранилище. Этот подход делает два действия: создает большой двоичный объект в хранилище и отправляет данные.

BlobClient blobClient = blobContainerClient.getBlobClient(name);
blobClient.upload(inputStream, contentLength);

Упражнения

Завершите работу приложения, добавив код отправки и скачивания, а затем разверните его в службе приложение Azure для тестирования.

Отправить

Чтобы отправить большой двоичный объект, вы реализуете BlobStorage.Save этот метод. Сначала вы получите объект, представляющий большой двоичный BlobClient объект, вызвав GetBlobClient объект BlobContainerClient. Затем используйте UploadAsync метод для BlobClient сохранения Stream данных, передаваемых этому методу в хранилище BLOB-объектов.

  • В редакторе замените Save в файле BlobStorage.cs на следующий код. Чтобы сохранить работу, используйте КЛАВИШИ CTRL+S.

    public Task Save(Stream fileStream, string name)
    {
        BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
    
        // Get the container (folder) the file will be saved in
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);
    
        // Get the Blob Client used to interact with (including create) the blob
        BlobClient blobClient = containerClient.GetBlobClient(name);
    
        // Upload the blob
        return blobClient.UploadAsync(fileStream);
    }
    

    Примечание.

    Приведенный здесь код отправки на основе потока работает эффективнее, чем считывание файла в массив байтов перед отправкой в хранилище больших двоичных объектов. Однако метод ASP.NET Core IFormFile , используемый для получения файла от клиента, не является истинной сквозной реализацией потоковой передачи. Это подходит только для обработки отправки небольших файлов.

Чтобы отправить большой двоичный объект, вы реализуете BlobStorage.save этот метод. Сначала вы получите объект, представляющий большой двоичный BlobClient объект, вызвав getBlobClient объект BlobContainerClient. Затем используйте upload метод для BlobClient сохранения InputStream данных, передаваемых этому методу в хранилище BLOB-объектов.

  • В редакторе замените save в файле BlobStorage.java на следующий код.

    public void save(String name, InputStream inputStream, long contentLength) {
        BlobClient blobClient = blobContainerClient.getBlobClient(name);
        blobClient.upload(inputStream, contentLength);
    }
    

Загрузка

Чтобы скачать файл, возвращается метод OpenReadAsync объекта BlobClient. Этот метод возвращает Streamзначение, которое означает, что код не должен загружать все байты из хранилища BLOB-объектов одновременно. Вам просто нужно вернуть ссылку на поток BLOB-объектов, который ASP.NET Core может использовать для потоковой передачи файла в браузер.

  • Замените Load следующим кодом и сохраните результаты работы, нажав CTRL + S.

    public Task<Stream> Load(string name)
    {
        BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
    
        // Get the container the blobs are saved in
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);
    
        // Get a client to operate on the blob so we can read it.
        BlobClient blobClient = containerClient.GetBlobClient(name);
    
        return blobClient.OpenReadAsync();
    }
    

Чтобы скачать файл, используйте метод openInputStream класса BlobClient. Этот метод возвращает значение InputStream, которое означает, что код не должен загружать все байты из хранилища BLOB-объектов одновременно. Вам просто нужно вернуть ссылку на поток BLOB-объектов, который IndexBean может использоваться для потоковой передачи содержимого в браузер.

Замените read следующим кодом и сохраните результаты работы.

public InputStream read(String name) {
    BlobClient blobClient = blobContainerClient.getBlobClient(name);
    return blobClient.openInputStream();
}

Развертывание и запуск в Azure

Приложение завершено. Разверните его и просмотрите его.

  1. Создайте приложение Службы приложений и задайте его конфигурацию с помощью настроек приложения для имени контейнера и строки подключения учетной записи хранения. Получите строку подключения учетной записи хранения с помощью az storage account show-connection-string и задайте контейнеру имя files.

    Имя приложения должно быть глобально уникальным. Выберите собственное имя для заполнения <your-unique-app-name>. Используйте имя учетной записи хранения, созданное ранее для замены <your-unique-storage-account-name>. Выполните каждую из следующих команд в Azure CLI:

    az appservice plan create \
    --name blob-exercise-plan \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --sku FREE --location eastus
    
    az webapp create \
    --name <your-unique-app-name> \
    --plan blob-exercise-plan \
    --resource-group "<rgn>[sandbox resource group name]</rgn>"
    
    CONNECTIONSTRING=$(az storage account show-connection-string \
    --name <your-unique-storage-account-name> \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --output tsv)
    
    az webapp config appsettings set \
    --name <your-unique-app-name> --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --settings AzureStorageConfig:ConnectionString=$CONNECTIONSTRING AzureStorageConfig:FileContainerName=files
    
  2. Развертывание приложения. Следующие команды публикуют сайт в папке pub, запакуйте его в site.zip и разверните ZIP-файл в Служба приложений.

    Примечание.

    Убедитесь, что оболочка по-прежнему находится в каталоге mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start перед выполнением следующих команд. Чтобы переключить каталог на это расположение, используйте cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start.

    dotnet publish -o pub
    cd pub
    zip -r ../site.zip *
    
    az webapp deploy \
    --src-path ../site.zip \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --name <your-unique-app-name>
    

    Чтобы просмотреть запущенное приложение, откройте https://<your-unique-app-name>.azurewebsites.net в браузере. Он должен выглядеть так, как показано на следующем изображении.

    Снимок экрана: веб-приложение FileUploader для C#.

  3. Попробуйте отправить и скачать некоторые файлы, чтобы протестировать приложение. После отправки нескольких файлов, чтобы просмотреть большие двоичные объекты в контейнере, запустите следующий код в оболочке. Замените <your-unique-storage-account-name> именем учетной записи хранения, созданной ранее в модуле:

    az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table
    

Приложение завершено. Разверните его и просмотрите его. Используйте подключаемый модуль Maven для службы приложение Azure, чтобы создать приложение Служба приложений, настроить его и развернуть.

  1. В редакторе откройте файл pom.xml и добавьте следующий файл plugins под build тегом XML.

    <plugins>
       <plugin>
         <groupId>com.microsoft.azure</groupId>
         <artifactId>azure-webapp-maven-plugin</artifactId>
         <version>2.3.0</version>
         <configuration>
           <schemaVersion>v2</schemaVersion>
           <subscriptionId>${env.AZ_SUBSCRIPTION_ID}</subscriptionId>
           <resourceGroup>${env.AZ_RESOURCE_GROUP}</resourceGroup>
           <appName>${env.AZ_APP_NAME}</appName>
           <pricingTier>${env.AZ_PRICING_TIER}</pricingTier>
           <region>${env.AZ_REGION}</region>
           <runtime>
             <os>Linux</os>
             <javaVersion>Java 11</javaVersion>
             <webContainer>Tomcat 9.0</webContainer>
           </runtime>
           <deployment>
             <resources>
               <resource>
                 <directory>${project.basedir}/target</directory>
                 <includes>
                   <include>*.war</include>
                 </includes>
               </resource>
             </resources>
           </deployment>
                 <appSettings>
                   <property>
                      <name>STORAGE_CONNECTION_STRING</name>
                      <value>${env.AZ_STORAGE_CONNECTION_STRING}</value>
                   </property>
                   <property>
                      <name>STORAGE_CONTAINER_NAME</name>
                      <value>${env.AZ_STORAGE_CONTAINER_NAME}</value>
                   </property>
                </appSettings>
         </configuration>
       </plugin>
       <plugin>  
         <groupId>org.apache.maven.plugins</groupId>  
         <artifactId>maven-war-plugin</artifactId>  
         <version>3.3.2</version>  
       </plugin> 
     </plugins>
    
  2. Следующие команды подготавливают переменные среды для подключаемого модуля Maven для Службы приложений Azure. Извлеките строка подключения учетной записи хранения с идентификатором подписки и az storage account show-connection-stringaz account showзадайте регион, цены, имя контейнера и имя приложения. Имя приложения должно быть глобально уникальным. Выберите собственное имя для заполнения <your-unique-app-name>.

    export AZ_SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    export AZ_RESOURCE_GROUP="<rgn>[sandbox resource group name]</rgn>"
    export AZ_REGION=eastus
    export AZ_APP_NAME=<your-unique-app-name>
    export AZ_PRICING_TIER=F1
    export AZ_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name <your-unique-storage-account-name> --output tsv)
    export AZ_STORAGE_CONTAINER_NAME=files
    

    Совет

    Минимальный рекомендуемый уровень для развертывания реальных приложений Java — любой план службы Premium V2.

  3. Развертывание приложения. Следующая команда создает приложение в ROOT.war и развертывает WAR-файл в Служба приложений. Подключаемый модуль Maven для службы приложение Azure подготавливает ресурсы при первой попытке развертывания.

    Примечание.

    Убедитесь, что оболочка по-прежнему находится в каталоге mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start перед выполнением следующих команд. Чтобы переключить каталог на это расположение, используйте cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start.

    mvn clean package azure-webapp:deploy
    

    Чтобы просмотреть запущенное приложение, откройте https://<your-unique-app-name>.azurewebsites.net в браузере. Он должен выглядеть так, как показано на следующем изображении.

    Снимок экрана: веб-приложение FileUploader для Java.

    Совет

    Этот модуль использует подключаемый модуль Maven для службы приложение Azure для развертывания приложения в Tomcat 9 в службе приложение Azure. Дополнительные сведения о других параметрах см . в разделе "Дополнительное чтение " в конце этого модуля.

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

    az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table