[javascript] FirebaseStorageにローカルファイルをアップロードする

目次

FirebaseStorageにローカルファイルをアップロードする

Googleが提供するリアルタイムDBサービスのStorageにWEBサーバ上にあるローカルファイルをアップロードしたい場合はjavascriptAPIを組み合わせてアップロードすることができる

Firebaseルール

Storageのルールを以下のように変更

match /image/{imageID} {
 allow write: if request.resource.contentType.matches('image/png')
 }
match /{allPaths=**} {
 allow read, write: if request.auth != null;
}

上記ルールではimageフォルダにpngファイルのみをアップロードでき、その他のフォルダには認証ユーザでないとアップロードできないようにした。

test.htmlもしくはtest.php


  
    Firebase Storage

    
    
    
    
    

    
    
    
    
    
    

  
    

 

APIキー取得

OverViewのアプリ追加でWEBを選択
スクリーンショット 2017-01-26 11.22.16

APIキーが表示されるのでコピー
スクリーンショット 2017-01-26 11.22.38

firabaseStorage.js

(function() { 
  //先程のAPIキーを貼り付け
  var config = {
    apiKey: "xxxxxxxxxxxxxxxxxxxxx",
    authDomain: "xxxxxxxxxxxxxxxxxxxxx",
    databaseURL: "xxxxxxxxxxxxxxxxxxxxx",
    storageBucket: "xxxxxxxxxxxxxxxxxxxxx",
    messagingSenderId: "xxxxxxxxxxxxxxxxxxxxx"
  };
  
  firebase.initializeApp(config);
  
  log('Upload is started');
    
  var storage = firebase.storage();
  var storageRef = firebase.storage().ref();
  var imagesRef = storageRef.child('image'); //FirebaseStorageのimageフォルダを指定
 
  var xhr = new XMLHttpRequest();
  xhr.open("GET", filePath, true);
  xhr.responseType = "arraybuffer";
 
  xhr.onreadystatechange = function(oEvent) {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            var file = new Blob([xhr.response], {type: "image/png"});
            var uploadTask = storageRef.child('image/image.png').put(file);

            uploadTask.on('state_changed', function(snapshot){
              log('state_changed');
            }, function(error) {
              log(error);
            }, function() {
                var downloadURL = uploadTask.snapshot.downloadURL;
                log(downloadURL);
                //その他処理.....
            });
        };
    };
  };
 
  xhr.send();

  

  /*************/
  /*  HELPERS  */
  /*************/
  /* Logs to the page instead of the console */
  function log(message) {
    var childDiv = document.createElement("div");
    var textNode = document.createTextNode(message);
    childDiv.appendChild(textNode);
    document.getElementById("log").appendChild(childDiv);
  }
})();

JavascriptからFirebaseStorageにアップロードする形式はBlobもしくはFileAPI型しか対応していないため、ローカルファイルを一度Blobに変換している

あとは
var uploadTask = storageRef.child(‘image/image.png’).put(file);
でファイルをアップロード開始し、

uploadTask.onで状態を監視している

ローカルファイルをXMLHttpRequestでGETしているが、XMLHttpRequestのreadyStateが「4」且つ、statusが200の場合のみBlob変換を開始するようにしている。

XMLHttpRequestのreadyState一覧

XMLHttpRequestのreadyStateの番号は以下の通り
4が正常終了

定数 状態
0 UNSENT XHRオブジェクトの作成直後
1 OPENED open()メソッドの呼び出し後
2 HEADERS_RECEIVED レスポンスヘッダの受信後
3 LOADING レスポンスボディを受信中(繰り返し実行される)
4 DONE XHR通信の完了後

XMLHttpRequestのstatusが0の場合

XMLHttpRequestのstatusが0と表示されるが、こちらはローカルファイルをローカルパスでアクセスした際に表示される、200と表示したい場合はローカルファイルへHTTPの外部ドメイン経由で取得すると良い。

ファイルが存在しない場合は「404」

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です