연습 - Blob 업로드 및 다운로드

완료됨

Blob Storage의 개별 Blob과 상호 작용하려면 BlobClient 개체를 사용합니다. Blob이 있는 BlobContainerClient에서 Blob의 이름으로 요청하여 BlobClient를 가져올 수 있습니다. BlobClient에는 Blob Storage에서 개별 Blob을 업로드, 다운로드, 관리하는 메서드가 있습니다.

BlobClient 개체 가져오기

BlobClient를 이름으로 가져오려면 Blob이 포함된 BlobContainerClient에서 Blob의 이름을 사용하여 GetBlobClient 메서드를 호출합니다. BlobClient 개체를 사용하여 Blob과 상호 작용할 수 있습니다. 즉, Blob Storage에서 Blob을 업로드, 다운로드 또는 관리할 수 있습니다.

Blob 간에 데이터를 이동하는 것은 시간이 걸리는 네트워크 작업입니다. .NET용 Azure Storage SDK는 네트워크 작업이 필요한 모든 메서드의 비동기 구현을 제공합니다. 애플리케이션에서 가능할 때마다 이러한 비동기 구현을 사용하는 것이 좋습니다.

대규모 데이터 개체로 작업할 때 바이트 배열이나 문자열과 같은 메모리 내 구조 대신 스트림을 사용하는 것이 좋습니다. 이 방식은 전체 콘텐츠를 대상으로 보내기 전에 메모리에 버퍼링하는 것을 방지합니다. ASP.NET Core는 요청 및 응답에서 스트림을 읽고 쓰는 작업을 지원합니다.

BlobClient를 이름으로 가져오려면 Blob이 포함된 BlobContainerClient에서 Blob의 이름을 사용하여 getBlobClient 메서드를 호출합니다. BlobClient 개체를 사용하여 Blob과 상호 작용할 수 있습니다. 즉, Blob Storage에서 Blob을 업로드, 다운로드 또는 관리할 수 있습니다.

대규모 데이터 개체로 작업할 때 바이트 배열이나 문자열과 같은 메모리 내 구조 대신 스트림을 사용하는 것이 좋습니다. 이 방식은 전체 콘텐츠를 대상으로 보내기 전에 메모리에 버퍼링하는 것을 방지합니다.

새 Blob 만들기

새 Blob을 만들려면 스토리지에 없는 Blob에 대한 참조에서 Upload 메서드 중 하나를 호출합니다. 이 방식은 스토리지에 Blob을 만들고 데이터를 업로드하는 두 가지 작업을 수행합니다.

BlobClient blobClient = containerClient.GetBlobClient(name);

var response = blobClient.UploadAsync(fileStream);

새 Blob을 만들려면 스토리지에 없는 Blob에 대한 참조에서 upload 메서드 중 하나를 호출합니다. 이 방식은 스토리지에 Blob을 만들고 데이터를 업로드하는 두 가지 작업을 수행합니다.

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

연습

업로드 및 다운로드 코드를 추가하여 앱을 완성한 다음 테스트를 위해 Azure App Service에 배포합니다.

업로드

Blob을 업로드하려면 BlobStorage.Save 메서드를 구현합니다. 먼저, BlobContainerClient에서 GetBlobClient를 호출하여 Blob을 나타내는 BlobClient 개체를 가져옵니다. 그런 다음 BlobClient에서 UploadAsync 메서드를 사용하여 이 메서드에 전달된 데이터의 Stream을 Blob Storage에 저장합니다.

  • 편집기에서 BlobStorage.csSave를 다음 코드로 바꿉니다. 작업 내용을 저장하려면 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);
    }
    

    참고 항목

    여기에 표시된 스트림 기반 업로드 코드는 Blob Storage에 전송하기 전에 바이트 배열로 파일을 읽는 것보다 효율적입니다. 그러나 클라이언트에서 파일을 가져오는 데 사용하는 ASP.NET Core IFormFile 기술은 진정한 엔드투엔드 스트리밍 구현이 아닙니다. 작은 파일의 업로드를 처리하는 데에만 적합합니다.

Blob을 업로드하려면 BlobStorage.save 메서드를 구현합니다. 먼저, BlobContainerClient에서 getBlobClient를 호출하여 Blob을 나타내는 BlobClient 개체를 가져옵니다. 그런 다음 BlobClient에서 upload 메서드를 사용하여 이 메서드에 전달된 데이터의 InputStream을 Blob Storage에 저장합니다.

  • 편집기에서 BlobStorage.javasave를 다음 코드로 바꿉니다.

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

다운로드

파일을 다운로드하려면 BlobClient 개체의 OpenReadAsync 메서드가 반환됩니다. 이 메서드는 Stream을 반환합니다. 이는 코드가 Blob Storage의 모든 바이트를 한 번에 로드할 필요가 없음을 의미합니다. ASP.NET Core가 파일을 브라우저로 스트리밍하는 데 사용할 수 있는 Blob 스트림에 대한 참조를 반환하면 됩니다.

  • 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();
    }
    

파일을 다운로드하려면 BlobClient에 대해 openInputStream 메서드를 사용합니다. 이 메서드는 InputStream을 반환합니다. 이는 코드가 Blob Storage의 모든 바이트를 한 번에 로드할 필요가 없음을 의미합니다. IndexBean이 콘텐츠를 브라우저에 스트리밍하는 데 사용할 수 있는 Blob 스트림에 대한 참조를 반환하면 됩니다.

read를 다음 코드로 바꾼 후 작업을 저장합니다.

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

Azure에서 배포 및 실행

앱이 완성되었습니다. 배포하고 작동하는지 확인합니다.

  1. App Service 앱을 만들고 스토리지 계정 연결 문자열 및 컨테이너 이름의 앱 설정을 사용하여 구성합니다. 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에 압축한 다음 App Service에 배포합니다.

    참고 항목

    다음 명령을 실행하기 전에 셸이 아직 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 deployment source config-zip \
    --src ../site.zip \
    --name <your-unique-app-name> \
    --resource-group "<rgn>[sandbox resource group name]</rgn>"
    

    실행 중인 앱을 확인하려면 브라우저에서 https://<your-unique-app-name>.azurewebsites.net을 엽니다. 다음 이미지와 같이 표시됩니다.

    Screenshot of the FileUploader web app for C#.

  3. 일부 파일을 업로드하고 다운로드하여 앱을 테스트해 봅니다. 몇 가지 파일을 업로드한 후 컨테이너의 Blob을 보려면 셸에서 다음 코드를 실행합니다. <your-unique-storage-account-name>을 모듈의 앞부분에서 만든 스토리지 계정 이름으로 바꿉니다.

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

앱이 완성되었습니다. 배포하고 작동하는지 확인합니다. Azure App Service용 Maven 플러그 인을 사용하여 App Service 앱을 만들고 구성하고 배포합니다.

  1. 편집기에서 pom.xml 파일을 열고 build xml 태그 아래에 다음 plugins를 추가합니다.

    <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. 다음 명령은 Azure App Service용 Maven 플러그 인에 대한 환경 변수를 준비합니다. az storage account show-connection-string으로 스토리지 계정의 연결 문자열을 추출하고, az account show로 구독 ID를 추출하고 지역, 가격 책정, 컨테이너 이름 및 앱 이름을 설정합니다. 앱 이름은 전역적으로 고유해야 합니다. <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 파일을 App Service에 배포합니다. Azure App Service용 Maven 플러그 인은 첫 번째 배포 시도 시 리소스를 프로비전합니다.

    참고 항목

    다음 명령을 실행하기 전에 셸이 아직 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을 엽니다. 다음 이미지와 같이 표시됩니다.

    Screenshot of the FileUploader web app for Java.

    이 모듈은 Azure App Service용 Maven 플러그 인을 사용하여 Azure App Service의 Tomcat 9에 앱을 배포합니다. 다른 옵션에 대해 알아보려면 이 모듈 마지막 부분의 추가 자료 섹션을 참조하세요.

  4. 일부 파일을 업로드하고 다운로드하여 앱을 테스트해 봅니다. 몇 가지 파일을 업로드한 후 컨테이너의 Blob을 보려면 셸에서 다음 코드를 실행합니다.

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