Azure Storage

Azure Blob Storageのコンテナ内にフォルダを作ってファイルアップロード/ダウンロードをしてみた

これまでこのブログで、Azure Blob Storageのコンテナ内に、直接ファイルをアップロード/ダウンロードするプログラムを作成してきたが、コンテナ内にフォルダを作って、その処理を実装することもできる。

今回は、Azure Blob Storageのコンテナ内にフォルダを作ってファイルアップロード/ダウンロードをしてみたので、共有する。

前提条件

下記記事の実装が完了していること。

Azure App ServiceからAzure Functionsを呼び出す際の通信をString型でなくObjectのままで実施してみたこれまでこのブログで取り上げてきたサンプルプログラム内では、Azure App ServiceからAzure Functionsを呼び出...

作成したサンプルプログラム(Azure Functions側)の内容

作成したサンプルプログラム(Azure Functions側)の構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。また、共通クラス・Azure App Serviceのプログラムは変更していない。

新しく追加した定数クラスの内容は以下の通りで、Azure Blob Storageのコンテナ内に作成するフォルダパスを定義している。

package com.example;

public class DemoFuncConst {

    /** BLOB上のファイルアップロードパス */
    public static final String BLOB_FILE_PATH = "upload/file/";
    
}

また、ファイルアップロードするサービスクラスの内容は以下の通りで、ファイルアップロードするBlob名に、フォルダパスの定数を追加している。

package com.example.service;

import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.example.DemoFuncConst;
import com.example.model.FileUploadParam;
import com.example.model.FileUploadResult;
import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.blob.BlobOutputStream;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.blob.CloudBlockBlob;

@Service
public class FileUploadService {

    /** Azure Storageのアカウント名 */
    @Value("${azure.storage.accountName}")
    private String storageAccountName;

    /** Azure Storageへのアクセスキー */
    @Value("${azure.storage.accessKey}")
    private String storageAccessKey;
    
    /** Azure StorageのBlobコンテナー名 */
    @Value("${azure.storage.containerName}")
    private String storageContainerName;

    /**
     * ファイルアップロード処理を行うサービス.
     * @param fileUploadParam ファイルアップロード用Param
     * @return ファイルアップロードサービスクラスの呼出結果
     */
    public FileUploadResult fileUpload(FileUploadParam fileUploadParam) {        
        // ファイルアップロード処理
        try {
            // Blobストレージへの接続文字列
            String storageConnectionString = "DefaultEndpointsProtocol=https;" 
                    + "AccountName=" + storageAccountName + ";" 
                    + "AccountKey=" + storageAccessKey + ";";

            // ストレージアカウントオブジェクトを取得
            CloudStorageAccount storageAccount 
                = CloudStorageAccount.parse(storageConnectionString);

            // Blobクライアントオブジェクトを取得
            CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

            // Blob内のコンテナーを取得
            CloudBlobContainer container 
                = blobClient.getContainerReference(storageContainerName);

            // Blob内のコンテナーにデータを書き込む
            CloudBlockBlob blob = container.getBlockBlobReference(
                DemoFuncConst.BLOB_FILE_PATH + fileUploadParam.getFileName());
            BlobOutputStream output = blob.openOutputStream();
            output.write(ArrayUtils.toPrimitive(fileUploadParam.getFileData()));
            output.close();

        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }

        FileUploadResult result = new FileUploadResult();
        result.setMessage("ファイルアップロードが完了しました。");
        return result;
    }
}

さらに、ファイルダウンロードするサービスクラスの内容は以下の通りで、ファイルダウンロードするBlobやそのリスト名に、フォルダパスの定数を追加している。

package com.example.service;

import java.io.InputStream;
import java.util.ArrayList;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.example.DemoFuncConst;
import com.example.model.FileData;
import com.example.model.GetFileListParam;
import com.example.model.GetFileListResult;
import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.blob.CloudBlockBlob;
import com.microsoft.azure.storage.blob.ListBlobItem;

@Service
public class GetFileListService {

    /** Azure Storageのアカウント名 */
    @Value("${azure.storage.accountName}")
    private String storageAccountName;

    /** Azure Storageへのアクセスキー */
    @Value("${azure.storage.accessKey}")
    private String storageAccessKey;

    /** Azure StorageのBlobコンテナー名 */
    @Value("${azure.storage.containerName}")
    private String storageContainerName;

    /**
     * ファイルリスト取得処理を行うサービス.
     * @param getFileListParam ファイル取得用Param
     * @return ファイルリスト取得サービスクラスの呼出結果
     */
    public GetFileListResult getFileList(GetFileListParam getFileListParam) {
        GetFileListResult result = new GetFileListResult();

        // ファイルアップロード処理
        try {
            // Blobストレージへの接続文字列
            String storageConnectionString = "DefaultEndpointsProtocol=https;" 
                    + "AccountName=" + storageAccountName + ";" 
                    + "AccountKey=" + storageAccessKey + ";";

            // ストレージアカウントオブジェクトを取得
            CloudStorageAccount storageAccount 
                = CloudStorageAccount.parse(storageConnectionString);

            // Blobクライアントオブジェクトを取得
            CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

            // Blob内のコンテナーを取得
            CloudBlobContainer container 
                = blobClient.getContainerReference(storageContainerName);

            // Blob情報を取得し、戻り値に設定する
            ArrayList<FileData> fileDataList = new ArrayList<>();
            int index = 1;
            
            for (ListBlobItem blobItem : container.listBlobs(
                     DemoFuncConst.BLOB_FILE_PATH, true)) {
                // ファイル名・ファイルパスを取得
                String filePath = blobItem.getUri().toString();
                String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);

                // Blobデータを読み込み
                CloudBlockBlob blob = container.getBlockBlobReference(
                    DemoFuncConst.BLOB_FILE_PATH + fileName);
                InputStream input = blob.openInputStream();

                // ファイルデータを設定
                FileData fileData = new FileData();
                fileData.setId(index);
                fileData.setFileName(fileName);
                fileData.setFilePath(filePath);
                fileData.setFileData(ArrayUtils.toObject(IOUtils.toByteArray(input)));
                fileDataList.add(fileData);
                index++;
            }
            result.setFileDataList(fileDataList);

        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }

        return result;
    }
}

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/azure-blob-storage-folder



「EaseUS Todo Backup」は様々な形でバックアップ取得が行える便利ツールだったパソコン内のデータを、ファイル/パーティション/ディスク等の様々な単位でバックアップしたり、バックアップのスケジュール設定や暗号化設定も...

作成したサンプルプログラムの実行結果

サンプルプログラムをAzure App Service、Azure Functionsにデプロイして実行した結果は、以下の通り。

1) サンプルプログラム実行前のBlobコンテナー内、upload/fileフォルダの内容は以下の通りで、2ファイルがアップロードされていることが確認できる。

2) Azure App ServiceのURL「https://azureappdemoservice.azurewebsites.net/」とアクセスすると、Blobコンテナー内のファイルが「アップロードファイルリスト」に表示されることが確認できる。
サンプルプログラムの実行結果_2_1

なお、Azure App ServiceのURLは、下記Azure App ServiceのURLから確認できる。
サンプルプログラムの実行結果_2_2

3) ファイルアップロードリストの「テスト.pdf」の「ダウンロード」ボタンを押下する。
サンプルプログラムの実行結果_3

4) 画面右上にダウンロードしたファイルが表示され、ダウンロードフォルダ下に「てすと.pdf」が出力されることが確認できる。
サンプルプログラムの実行結果_4_1

サンプルプログラムの実行結果_4_2

また、ダウンロードした「てすと.pdf」の中身は以下の通り。このファイルの中身は、アップロードしたファイルと同じものになっている。
サンプルプログラムの実行結果_4_3



サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

5) 画面上で「ファイルの選択」ボタンを押下する。
サンプルプログラムの実行結果_5

6) アップロードするファイルを選択し、「開く」ボタンを押下する。
サンプルプログラムの実行結果_6

7) 「アップロード」ボタンを押下する。
サンプルプログラムの実行結果_7

8) 以下のように、アップロードしたファイルが、一覧に追加されることが確認できる。
サンプルプログラムの実行結果_8

9) サンプルプログラム実行後のBlobコンテナー内、upload/fileフォルダの内容は以下の通りで、アップロードしたファイルが追加されていることが確認できる。
サンプルプログラムの実行結果_9

要点まとめ

  • Azure Blob Storageのコンテナ内に、ファイルをアップロード/ダウンロードする際、コンテナ内にフォルダを作って実施することもできる。