Firebase入門 - ファイル保存&管理機能を利用する

Firebaseを使ってファイル保存&管理機能を簡単に実装するための手順をまとめてみました。

# Storage
サーバ側のコードを使わずにユーザーが生成した写真や動画などのコンテンツを保管、提供する事ができる機能です。
今回はファイルアップロードとダウンロード(参照)を試してみます。

# ファイルをダウンロード(参照)してみる。
Firebaseコンソールからアップロードした画像ファイルを参照して画面に表示できるようにしてみます。

1. Firebaseコンソールを開き Storage機能を追加したいプロジェクトを選びます。<br>[Firebaseコンソール](https://console.firebase.google.com/?hl=ja)
1. 左メニュー Storage を選択する。<br> ![スクリーンショット 2017-03-08 16.14.09.png](https://qiita-image-store.s3.amazonaws.com/0/100147/bc343eb9-e94c-4f9d-6000-2f6f47c92809.png)
1. ファイルアップロードボタンから適当な画像をアップロードする。<br>![sample.png](https://qiita-image-store.s3.amazonaws.com/0/100147/346f221e-e29e-8460-bdfd-d9c17833dbca.png)

1. Storage バケット URL を確認する。<br>![スクリーンショット 2017-03-08 16.30.51.png](https://qiita-image-store.s3.amazonaws.com/0/100147/528c699c-4628-57b3-903f-b3c68baa63a6.png)

1. "ウェブアプリに Firebase を追加"を選択して表示される JavaScript を index.htmlに追加する<br> ![スクリーンショット 2017-03-02 13.58.25.png](https://qiita-image-store.s3.amazonaws.com/0/100147/c89505a3-f062-a1d7-1d76-b24b59cba435.png)

    ```
<script src="https://www.gstatic.com/firebasejs/live/3.0/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: "あなたのAPIキー",
    authDomain: "myfirstfirebase(的な名前).firebaseapp.com",
    databaseURL: "https://myfirstfirebase-(的な名前).firebaseio.com",
    storageBucket: "myfirstfirebase-(的な名前).appspot.com",
  };
  firebase.initializeApp(config);
</script>
    ```
 
1. htmlにStorageを利用する為のコードを追加していきます。<br>画像を表示するための領域をhtmlに追加します。

    ```
   <div id="imgSample" style="display:block;width:200px;height:200px;background-color:#c0c0c0;"></div>
    ```
1. ストレージバケットを Firebase SDK の構成に追加する必要があります。<br>storageBucket: 'XXXXXXXXX.appspot.com' の部分です。

    ```
    var config = {
     apiKey: '<your-api-key>',
     authDomain: '<your-auth-domain>',
     databaseURL: '<your-database-url>',
     storageBucket: 'XXXXXXXXX.appspot.com'
   };
   firebase.initializeApp(config);
   ```
1. アップロードした画像を参照するためのコードを追加します。<br>

    ```
    //ストレージのルートのリファレンスを取得
    var storageRef = firebase.storage().ref();
    //ストレージのルートにあるsample.pngのリファレンスを取得    
    var imgSample = storageRef.child('sample.png');
    ```
1. htmlがブラウザにロードされたあと、ストレージからダウンロードして画面に表示してみるコードを追加します。

    ```
    window.onload = function() {
      //htmlロード完了したらストレージの画像を表示してみる
      imgSample.getDownloadURL().then(function(url){
        document.getElementById("imgSample").style.backgroundImage = "url("+url+")";
      }).catch(function(error) {
        // Handle any errors
        console.log(error);
      });
    };
   ```
1. ローカル環境で実行して内容を確認してみる <br>``` firebase serve ```<br>表示される URLをブラウザで開く<br>```http://localhost:5000```
1. セキュリティルールがデフォルトの場合表示されない事を確認する。<br> 403エラーがjavascriptコンソールに出力されている筈です。
1. Firebaseコンソールを開き Storageのルールタブを選択する。<br>ログインせずに参照できるルールを設定してみます。<br>``` allow read; ```を追加<br>![スクリーンショット 2017-03-08 17.19.14.png](https://qiita-image-store.s3.amazonaws.com/0/100147/5cf7b06e-e6fc-50a6-1cd3-a9188e0be9d2.png)
1. もう一度ローカル環境で実行して表示してみる。<br>画像が表示される筈。

ここまでのコードでストレージのファイルを参照する処理を実装することができました。
セキュリティルールの部分は少しわかりにくいかもしれませんが、この機能のおかげで簡単にユーザー毎の画像のアクセス権の制御などの実装もできるようです。

# ファイルをアップロードしてみる
ファイルをアップロードするコードを追加して表示できるようにしてみます。

1. ``` <input type="file">```をhtmlに追加します。

    ```
    <input type="file" id="btnUpload" value="アップロード">
    ```

1. File および Blob API 経由でファイルを受け取って Storage にアップロードするこコードを書きます。

    ```
     //ストレージへアップロードする
    var btnUploadChange = function(ev){
       //ストレージへアップロードするファイルのパスを生成する
       var uploadRef = storageRef.child('upload.png');
       const f = ev.target.files[0];
       uploadRef.put(f).then(function(snapshot) {
         console.log('Uploaded a blob or file!');

         //アップロードしたファイルを表示してみる
         uploadRef.getDownloadURL().then(function(url){
           console.log("imgSample "+url);
           document.getElementById("imgSample").style.backgroundImage = "url("+url+")";
         }).catch(function(error) {
           // Handle any errors
           console.log(error);
         });

       });
    };
    //htmlロードが完了したらボタンにイベントを設定
    window.onload = function() {
     document.getElementById("btnUpload").onchange = btnUploadChange;
    };
    ```
1. ローカル環境で実行して内容を確認してみる <br>``` firebase serve ```<br>表示される URLをブラウザで開く<br>```http://localhost:5000```
1. Facebookログイン前だとファイルがアップロードできない事を確認する<br> javascriptコンソールに 403エラーが表示されている筈。
1. Facebookログインをした後、ファイルをアップロードすると表示される事を確認する。
1. デプロイを実行する <br>`firebase deploy --only hosting`
1. デプロイ成功したら ブラウザで開いてアップロードできるか確認してみる. <br>`firebase open hosting:site` 

サーバ側のコードをまったく書かずに、ファイルアップロードの実装までできました。セキュリティルールのおかげで、ユーザー認証していない状態だとアップロードできない等の仕組みも簡単に実装する事ができます。

# 参考
[Firebase Storage](https://firebase.google.com/docs/storage/?hl=ja)