FirebaseでファイルダウンロードURL取得
Firebase Cloud FunctionsでアップロードされたファイルのダウンロードURLを取得する (Node.js)
Firebase Cloud Functionsを使用して、アップロードされたファイルをストレージからダウンロードするためのURLを取得する方法について説明します。この手法は、ファイルの共有、ダウンロード、または外部システムとの連携に役立ちます。
前提条件
- Firebase Cloud Functionsの環境がセットアップされていること
- Node.jsとnpm(またはyarn)がインストールされていること
- Firebase CLIがインストールされていること
- Firebaseプロジェクトが作成されていること
ステップ
-
Firebaseプロジェクトの初期化
firebase init
プロジェクトの設定に従ってください。
-
firebase init functions
Node.jsランタイムを選択し、必要なパッケージをインストールします。
const functions = require('firebase-functions'); const admin = require('firebase-admin');
admin.initializeApp();
exports.getFileDownloadURL = functions.https.onRequest(async (req, res) => { const fileId = req.query.fileId; // ファイルIDを取得
try {
const bucket = admin.storage().bucket();
const file = bucket.file(fileId);
const [url] = await file.getSignedUrl({
action: 'read',
expires: '01m', // 有効期限を設定(1分)
});
res.send({ url }); // ダウンロードURLをレスポンスとして返す
} catch (error) {
console.error('Error fetching file:', error);
res.status(500).send({ error: 'Failed to fetch file' });
}
});
4. **Cloud Functionsをデプロイ:**
```bash
firebase deploy --only functions
コードの説明
res.send()
:ダウンロードURLをレスポンスとして返します。file.getSignedUrl()
:ファイルの署名付きURLを取得します。action
:操作タイプ("read"、"write"など)。expires
:有効期限を設定します。
admin.storage().bucket()
:ストレージのバケットを取得します。req.query.fileId
:リクエストのパラメータからファイルIDを取得します。functions.https.onRequest()
:HTTPリクエストを処理するためのCloud Functionを作成します。admin.initializeApp()
:Firebaseプロジェクトを初期化します。
使用方法
- 成功すると、ダウンロードURLがレスポンスとして返されます。
- Cloud Functionsをデプロイした後、以下のURLにアクセスしてファイルIDを指定してください。
https://your-project-id.cloudfunctions.net/getFileDownloadURL?fileId=your-file-id
注意点
- ストレージの容量制限に注意してください。
- ファイルのサイズやアクセス頻度によっては、ダウンロードURLの発行に時間がかかる場合があります。
- 有効期限を設定することで、ダウンロードURLのセキュリティを確保できます。
- ファイルIDは、ストレージにファイルをアップロードしたときに取得できます。
try {
const bucket = admin.storage().bucket();
const file = bucket.file(fileId);
const [url] = await file.getSignedUrl({
action: 'read',
expires: '01m', // 有効期限を設定(1分)
});
res.send({ url }); // ダウンロードURLをレスポンスとして返す
} catch (error) {
console.error('Error fetching file:', error);
res.status(500).send({ error: 'Failed to fetch file' });
}
4. **Cloud Functionsをデプロイ:**
```bash
firebase deploy --only functions
方法1: Firebase Admin SDKを使用する
- この方法は、サーバーサイドのアプリケーションから直接ファイル操作を行う場合に便利です。
- Firebase Admin SDKを使用して、直接ストレージにアクセスし、ファイルのダウンロードURLを取得します。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.get FileDownloadURL = functions.https.onRequest(async (req, res) => {
const fileId = req.query.fileId;
try {
const bucket = admin.storage().bucket();
const file = bucket.file(fileId);
const [url] = await file.getSignedUrl({
action: 'read',
expires: '01m',
});
res.send({ url });
} catch (error) {
console.error('Error fetching file:', error);
res.status(500).send({ error: 'Failed to fetch file' });
}
});
方法2: Firebase Storage APIを使用する
- Firebase Storage APIを使用して、REST APIまたはクライアントライブラリを通じてファイルのダウンロードURLを取得します。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.get FileDownloadURL = functions.https.onRequest(async (req, res) => {
const fileId = req.query.fileId;
try {
const bucket = admin.storage().bucket();
const url = await bucket.file(fileId).getSignedUrl({
action: 'read',
expires: '01m',
});
res.send({ url });
} catch (error) {
console.error('Error fetching file:', error);
res.status(500).send({ error: 'Failed to fetch file' });
}
});
方法3: Firebase Storage APIとCloud Functionsの連携
- この方法は、ファイルのダウンロード前に認証やアクセス制御を実装する場合に便利です。
- Firebase Storage APIを使用して、ファイルのダウンロードURLを取得し、Cloud Functionsで追加処理を行う。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.get FileDownloadURL = functions.https.onRequest(async (req, res) => {
const fileId = req.query.fileId;
try {
// 認証やアクセス制御の処理
// ...
const bucket = admin.storage().bucket();
const url = await bucket.file(fileId).getSignedUrl({
action: 'read',
expires: '01m',
});
res.send({ url });
} catch (error) {
console.error('Error fetching file:', error);
res.status(500).send({ error: 'Failed to fetch file' });
}
});
選択基準
- クライアントサイド操作
Firebase Storage APIを使用。 - サーバーサイド操作
Firebase Admin SDKを使用。
node.js firebase google-cloud-functions