自己紹介
大同大学2年生の久米 史也です。
Xamarin とかいじってます。
Azure Blob Storage とは
Azure Blob Storage はエクサバイト単位の容量と極めて高いスケーラビリティを備えており、必要なデータ アクセス頻度に応じてホット層またはクール層に、数百個から数十億個のオブジェクトを簡単かつコスト効率よく保管することができます。画像、ビデオ、音声、ドキュメントなど、あらゆる種類の非構造化データを保存できます。
https://azure.microsoft.com/ja-jp/services/storage/blobs/ より引用
正確ですが、読みにくい文章なので、少しかみ砕いて解説します。
簡単に言うと、画像とか、テキストとか、ビデオとかのあらゆるファイルを保存できるストレージです。
SNS 等で、ユーザーの投稿したデータを保存するのに使うと、イメージしていただけるとわかりやすいかと。
ファイルの保存やクラウドからの転送にかかる料金は、
- ファイルの保存:1TB までが、¥2.45/GB だったり、
- クラウドからの転送:100,000 回あたり、 ¥0.37
といった感じです。お安めかなと思います。
参考資料: Azure Storage 料金
今回やっていくこと
Android から 画像を Azure Blob Storage へアップロードしていきます。
準備
- サブスクリプションが有効になっている Microsoft Azure アカウント
- Android Studio (自分は、2.3 を使いました)
やったこと
1. Android のプロジェクトを作成
Empty Activity のテンプレートを選べば大丈夫かなと思います。
2. ボタンを一つ配置する
// 基本的なところなので、コードは省略
id は button にしておきます。
3. Azure 側の準備をする
Azure Portal へアクセス
Blob Storage を作成
右上の + ボタンをクリックすると出てくる検索ボックスに Blob と入力すると Azure Blob Storage がサジェストされるのでそれをクリックします。
Azure Blob Storage の設定を続ける
名前は、 Azure 内全ユーザーでユニークな 名前を付けてあげてください。
リソースグループは、個々のユーザーごとにユニークな名前をつけてください。
サブスクリプションについては、 Imagine でもらえるサブスクリプションでは作成することができないので、 MSP の主催するイベント 等に参加することでもらえる Azure Pass 等を利用してください
最後に、ダッシュボードにピン止めをする をクリック、完了をクリックで設定は終了です。
Azure Blob Storage の作成が完了
以下のような画面が開くかと思います。
サービスカテゴリの Blob という部分を開いてみましょう
まだ、コンテナーが作成されていないというメッセージが出たかと思います。
コンテナー... どのようなものでしょうか?
ここで、 Azure Blob Storage の仕組みについて見ていきましょう。
.NET を使用して Azure Blob Storage を使用する より引用
ぱっと見で分かりにくいかもしれません、普段使い慣れているコンピュータ用語に置き換えて考えてみてはどうでしょうか?
アカウント = USB メモリ
コンテナー = USB メモリ に入っているフォルダ
BLOB = フォルダの中に置かれている画像コレクションや動画コレクション
わかるような気がしますよね?
Azure Blob のコンテナーを作成
左上のボタンからコンテナーを作成していきます。
Azure Blob Storage のコンテナーの名前を付けるときの注意点ですが、すべて小文字にしなければいけません
また、アクセスの種類は Blob にしてください
これで、 Azure の準備は完了しました。
4. Android 側の Azure Blob Storage と接続するためのロジックの作成
Android の MainActivity.java を開いてください。
そして、以下のコードを入力してください
// import は省略
public class MainActivity extends AppCompatActivity {
public Button Button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button = (Button) findViewById(R.id.button);
Button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// UIスレッドでネットワークを使った重い処理を実行させるとつらみが発生するため、別スレッドで実行
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
// Azure Blob Storage と接続するための文字列、チョー重要。 Root アカウントのパスワードぐらい重要です。
String storageConnectionString = "Connection String";
// DCIM へのパスを取得
File dir = new File(Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM);
// DCIM 上の画像ファイルへのパスを設定
File file = new File(dir.getAbsolutePath() + "/image.jpeg");
// 正しい画像へのパスが取れているか確認のためにログ出力
Log.d("画像を表示させるやつ", file.getPath());
try {
// Azure Storage Account との接続を開始
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
// Azure Storage Account の Blob との接続するためのクライアントを取得
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
// Blob のコンテナーを取得している、コンテナーの指定は文字列で行う
CloudBlobContainer container = blobClient.getContainerReference("mspjp");
// getBlockBlobReference の引数で渡している文字列が、 Blob 内に保存されるファイル名になる。
// すでに同じ名前のファイルが存在するときは、上書きされる
CloudBlockBlob blob = container.getBlockBlobReference("myimage.jpg");
// ファイルが存在しなかったら 関数を終了させる
if (!file.exists()) return null;
// Azure Blob Storage へアップロード
blob.upload(new java.io.FileInputStream(file), filelength());
} catch (Exception e) {
// エラーが起きたら解析用にスタックトレースを吐かせる
e.printStackTrace();
}
return null;
}
};
try {
// 別スレッドで実行させる
task.execute();
} catch (Exception e) {
Handler handler = new Handler();
handler.post(new Runnable() {
// エラーが発生したらトーストでエラーメッセージを表示させたいが、
// UI スレッドでなければ、トーストを表示させれないため、 UI スレッドで実行している
@Override
public void run() {
Toast.makeText(MainActivity.this, "Faild: Upload blob storage", Toast.LENGTH_LONG).show();
}
});
}
}
});
}
}
5. アップロードするための画像の配置
Android を PC とつなぎ、 Android の外部ストレージを開いて、 そのなかにある DCIM というフォルダの中に、 image.jpeg という画像ファイルを置いてください
6. storageConnectionString の設定
storageConnectionString は各ユーザー( Storage Account)ごとに違う ので今から取得していきましょう。
まずは、先ほど作成した Azure Blob Storage の画面を開いてください
アクセスキーと書かれた部分をクリックしてください
key1 の接続文字列をコピーして storageConnectionString に代入するようにコードを書き換えてください
実行
以上でコーディングは終了したので、実行してみてください。
実行後、 Azure Blob Storage の コンテナーのところを開くと画像がアップロードされているのがわかるかと思います。
感想
- Java 楽しい
- Azure はドキュメントがそろっているので、わからないことがあっても解決しやすいと感じました。