Cloud Functions for Firebase を使ってアップロードされたファイルのダウンロードURLを取得する方法
このチュートリアルでは、Cloud Functions for Firebase を使って、アップロードされたファイルのダウンロードURLを取得する方法を説明します。この方法は、ユーザーがアップロードしたファイルにアクセスするための安全な方法を提供します。
前提知識
このチュートリアルを始める前に、以下の知識が必要です。
- Node.js の基本的な知識
- Firebase アカウント
- Cloud Functions for Firebase の基本的な知識
必要なもの
- Firebase プロジェクト
- Cloud Storage バケット
手順
Cloud Functions のインストール
ターミナルを開き、プロジェクトディレクトリに移動します。
以下のコマンドを実行して、Cloud Functions の必要なライブラリをインストールします。
npm install firebase-admin functions
Cloud Functionの作成
以下のコードを
index.js
という名前のファイルに保存します。const admin = require('firebase-admin'); const functions = require('firebase-functions'); firebase.initializeApp(functions.config()); exports.getDownloadURL = functions.storage.onObjectChange(event => { const file = event.data; const filePath = file.fullPath; console.log('File uploaded: ', filePath); const bucket = admin.storage().bucket(file.bucket); const fileRef = bucket.file(filePath); fileRef.getDownloadURL().then(url => { console.log('Download URL:', url); }).catch(error => { console.error('Error getting download URL:', error); }); });
このコードは、Cloud Storage バケットにファイルがアップロードされたときにトリガーされ、アップロードされたファイルのダウンロードURLをコンソールに出力します。
以下のコマンドを実行して、Cloud Function をデプロイします。
functions deploy
デプロイが成功すると、コンソールにデプロイログが表示されます。
テスト
- ダウンロードURLの有効期限はデフォルトで 7 日間です。必要に応じて、
getDownloadURL()
メソッドのオプションで有効期限を変更できます。 - Cloud Functions for Firebase は、アップロードされたファイルに対してのみトリガーされます。既存のファイルに対してはトリガーされません。
- セキュリティ上の理由から、ダウンロードURLを直接クライアントに公開しないでください。代わりに、ダウンロードURLを認証済みのサーバーエンドポイントに送信し、そのサーバーエンドポイントからファイルを配信するようにしてください。
const admin = require('firebase-admin');
const functions = require('firebase-functions');
firebase.initializeApp(functions.config());
exports.getDownloadURL = functions.storage.onObjectChange(event => {
const file = event.data;
const filePath = file.fullPath;
console.log('File uploaded: ', filePath);
const bucket = admin.storage().bucket(file.bucket);
const fileRef = bucket.file(filePath);
fileRef.getDownloadURL().then(url => {
console.log('Download URL:', url);
}).catch(error => {
console.error('Error getting download URL:', error);
});
});
コードの説明
このコードは、以下のことを行います。
firebase-admin
とfunctions
モジュールの import- Firebase アプリの初期化
onObjectChange
トリガーの作成- アップロードされたファイルのパスを取得
- Cloud Storage バケットとファイル参照の作成
getDownloadURL()
メソッドを使ってダウンロードURLを取得- ダウンロードURLをコンソールに出力
- エラー処理
使い方
このコードを index.js
という名前のファイルに保存し、以下のコマンドを実行して Cloud Function をデプロイします。
functions deploy
この方法は、Firebase Admin SDK を使用して Cloud Storage バケットに直接アクセスし、ファイルをアップロードしてダウンロードURLを取得します。この方法は、以下の点に利点があります。
- コードが簡潔で分かりやすい
- 追加のライブラリをインストールする必要がない
ただし、この方法には以下の欠点もあります。
- サービスアカウントキーが必要であり、セキュリティ上のリスクが高くなります
- Cloud Functions のみにアクセス可能な一時的なダウンロードURLしか取得できない
const admin = require('firebase-admin');
const functions = require('firebase-functions');
firebase.initializeApp(functions.config());
exports.getDownloadURL = functions.storage.onObjectChange(event => {
const file = event.data;
const filePath = file.fullPath;
console.log('File uploaded: ', filePath);
const bucket = admin.storage().bucket(file.bucket);
const fileRef = bucket.file(filePath);
fileRef.getDownloadURL().then(url => {
console.log('Download URL:', url);
}).catch(error => {
console.error('Error getting download URL:', error);
});
});
Google Cloud Storage API を使用する
- 署名付きURLを使用して、永続的なダウンロードURLを取得できる
- サービスアカウントキーを使用せずに、さまざまな権限でアクセスできる
- コードが複雑で分かりにくい
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const { Storage } = require('@google-cloud/storage');
firebase.initializeApp(functions.config());
const storage = new Storage();
exports.getDownloadURL = functions.storage.onObjectChange(event => {
const file = event.data;
const filePath = file.fullPath;
console.log('File uploaded: ', filePath);
const bucketName = file.bucket;
const fileName = filePath.split('/').pop();
storage.bucket(bucketName).file(fileName).getSignedUrl({
action: 'read',
expires: Date.now() + 60 * 60 * 24 * 7 // 7 days
}).then(url => {
console.log('Download URL:', url);
}).catch(error => {
console.error('Error getting download URL:', error);
});
});
node.js firebase google-cloud-functions