JSからAzureストレージに画像アップロードしてみる

さて、今回はAzureのストレージにJSから画像上げるのってどうやるんだ？？
と言うのが分からなかったのでやってみたと言う話です。

## 結論

手順は以下

- Azure Storage Blobで先ず箱を作る
- アップロード先のコンテナーを作る
- CORSの設定をする
- Shared Access Signature (SAS) トークンを作成する
- JSを書いて実行する

※殆どの手順はMicrosoft公式ドキュメント [https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-javascript-client-libraries-legacy](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-javascript-client-libraries-legacy) 通りです！ｗ


## Azure Storage Blobで先ず箱を作る

![スクリーンショット 2021-12-23 17.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/b619c62b-7292-e754-5fa0-f2ba03099f0d.png)

![スクリーンショット 2021-12-23 17.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/4d14e8fb-70a2-a519-32b0-110a827594bd.png)
以降全てデフォルトのまま次へ次へとしていって作成

暫く待つと・・・無事作成されました！
![スクリーンショット 2021-12-23 17.32.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/8e96a843-1f4a-d826-278a-33c2cae3297c.png)

## アップロード先のコンテナーを作る

コンテナーとはディレクトリのようなもののようです。
ストレージアカウントのメニューのコンテナーから簡単に作成が可能です。
好きな名前を付け、画像ディレクトリとする場合はパブリックレベルをBLOBとして作成します。
![スクリーンショット 2021-12-23 20.07.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/93818a4e-f368-db49-6137-c475c0a0fa12.png)

## CORSの設定をする

CROSの設定をしないと、外部ドメインからのアップロード・・・と言うかAzureStorageへのアクセスが当然出来ません。
なので設定をするのですが、コチラもストレージアカウントのメニューから簡単に設定が可能になってます。
素晴らしいねAzure！！
(※Firebaseだとコマンドからやらないと設定出来ない)
![スクリーンショット 2021-12-23 20.45.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/c3c2a397-d802-341f-8833-2d5a706690b0.png)
※ただ、ホストのところを「*」としないと私の場合は以降の手順がうまく行きませんでした。
ホスト名を縛る等のセキュリテイは一旦ココでは語りません。

## Shared Access Signature (SAS) トークンを作成する

SASはJSからAzureストレージにアクセスする際に必要になる文字列です。
そしてなんとコレも！ストレージアカウントのメニューから簡単に作成が可能になってます。
こう言うところは本当に便利でちょっとAzure好きになりました、正直。
![スクリーンショット 2021-12-23 20.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/e5362b82-ee17-7403-0a18-d9933b12cb6d.png)
※作成したSASは後からは確認出来ないので大切にメモして起きましょう！
![スクリーンショット 2021-12-23 20.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/caca0cb6-ff95-ffd5-e44c-655623f97096.png)

## JSを書いて実行する

Azureストレージにアップロードするだけのサンプルソースを置いておきますので参考にして下さいm(_ _)m

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <title>Azure画像アップローダ</title>
</head>
<body>
  <input type="file" id="imageupload">
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@azure/storage-blob@10.5.0/browser/azure-storage-blob.min.js"></script>
<script type="text/javascript">
  $('#imageupload').change(async function(event) {
    try {
      let target = event.target;
      let accountName = 'sample20211223';
      let containerName = 'images';
      let sasString = 'メモした?sv=から始まるSAS文字列の先頭の?を除いた文字列';
      let containerURL = new azblob.ContainerURL(
          `https://${accountName}.blob.core.windows.net/${containerName}?${sasString}`,
          azblob.StorageURL.newPipeline(new azblob.AnonymousCredential));
      let promises = [];
      let blockBlobURL = azblob.BlockBlobURL.fromContainerURL(containerURL, event.target.files[0].name);
      let imageurl = `https://${accountName}.blob.core.windows.net/${containerName}/${event.target.files[0].name}`;
      promises.push(azblob.uploadBrowserDataToBlockBlob(azblob.Aborter.none, event.target.files[0], blockBlobURL));
      await Promise.all(promises);
      alert('アップロード完了！');
    }
    catch (error) {
      console.log('error=', error);
    }
  });
</script>
</body>
</html>
```

上記htmlをブラウザで開いて、適当な画像ファイルを選ぶとimagesコンテナに画像がアップロードされます。
![スクリーンショット 2021-12-23 20.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/9baf254b-4352-bc15-ac8d-f2e8096dff78.png)

コンテナーを確認して見るとちゃんと画像がアップロードされているかと思います。
![スクリーンショット 2021-12-23 21.21.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151630/ce981e28-ddac-0df0-6a17-a3d9042432ae.png)

以上、知っていると簡単なのですが
古い情報と新しい情報が混在していて正解が分からなかったりと以外に苦労したので記事にしてみました(^_^;)

参考になれば幸いですm(_ _)m