これまでこのブログで、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のコンテナ内に、ファイルをアップロード/ダウンロードする際、コンテナ内にフォルダを作って実施することもできる。







