[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を選択

APIキーが表示されるのでコピー

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」