これまでこのブログで、Azure Blob Storageのコンテナ内に、直接ファイルをアップロード/ダウンロードするプログラムを作成してきたが、コンテナ内にフォルダを作って、その処理を実装することもできる。
今回は、Azure Blob Storageのコンテナ内にフォルダを作ってファイルアップロード/ダウンロードをしてみたので、共有する。
前提条件
下記記事の実装が完了していること。
作成したサンプルプログラム(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
作成したサンプルプログラムの実行結果
サンプルプログラムをAzure App Service、Azure Functionsにデプロイして実行した結果は、以下の通り。
1) サンプルプログラム実行前のBlobコンテナー内、upload/fileフォルダの内容は以下の通りで、2ファイルがアップロードされていることが確認できる。
2) Azure App ServiceのURL「https://azureappdemoservice.azurewebsites.net/」とアクセスすると、Blobコンテナー内のファイルが「アップロードファイルリスト」に表示されることが確認できる。
なお、Azure App ServiceのURLは、下記Azure App ServiceのURLから確認できる。
3) ファイルアップロードリストの「テスト.pdf」の「ダウンロード」ボタンを押下する。
4) 画面右上にダウンロードしたファイルが表示され、ダウンロードフォルダ下に「てすと.pdf」が出力されることが確認できる。
また、ダウンロードした「てすと.pdf」の中身は以下の通り。このファイルの中身は、アップロードしたファイルと同じものになっている。
6) アップロードするファイルを選択し、「開く」ボタンを押下する。
8) 以下のように、アップロードしたファイルが、一覧に追加されることが確認できる。
9) サンプルプログラム実行後のBlobコンテナー内、upload/fileフォルダの内容は以下の通りで、アップロードしたファイルが追加されていることが確認できる。
要点まとめ
- Azure Blob Storageのコンテナ内に、ファイルをアップロード/ダウンロードする際、コンテナ内にフォルダを作って実施することもできる。