Firebaseのstorageにformの画像をアップロードする

概要

type='file'指定したinputから画像を選択し、formがsubmitされたときにFirebaseのstorageにその画像をアップロードします。
その際、複数画像のアップロードにも対応します。

storageのルール

ルールは以下のようにします。
バケットの/form-uploaded 配下にのみアップロードを許可し、MAX20MBの画像ファイルを許可する設定です。

1
2
3
4
5
6
7
8
9
10
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /form-uploaded/{id} {
allow write : if request.resource.size < 20 * 1024 * 1024
&& request.resource.contentType.matches('image/.*');
}
}
}

htmlとjs

htmlとjsは以下です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<html>
<head></head>
<body>
<form>
<input type='file' accept='image/*' multiple='multiple' name='imgs[]'>
<button type='submit'>送信</button>
</form>

<script src='https://www.gstatic.com/firebasejs/7.5.0/firebase-app.js'></script>
<script src='https://www.gstatic.com/firebasejs/7.5.0/firebase-storage.js'></script>
<script>

//firebase初期化
var firebaseConfig = {
apiKey: 'xxxxx',
projectId: 'yyyyy',
storageBucket: 'zzzzzz',
}
firebase.initializeApp(firebaseConfig);

//formのsubmitにイベント設定
var form = document.querySelector('form');
form.addEventListener('submit', function (e) {
e.preventDefault();
var imgs = form.querySelector('input');
var uploads = [];
for (var file of imgs.files) {
//選択したファイルのファイル名を使うが、場合によってはかぶるので注意
var storageRef = firebase.storage().ref('form-uploaded/' + file.name);
uploads.push(storageRef.put(file));
}
//すべての画像のアップロード完了を待つ
Promise.all(uploads).then(function () {
console.log('アップロード完了');
});
});
</script>

</body>
</html>

JavaScriptカテゴリの記事