使用firebase-admin上傳檔案到Firebase storage

近期使用較多的Firebase服務,在參考使用Firebase提供的Node.js的函數庫一段時間後,才意識到Firebase是有兩組不同的操作。

就算透過AI詢求幫助時,也總是會混合著解兩者的回應。所以個人就試錯後,將方法整理成一個簡短的使用範例。以下就針對Firebase的firebase-admin函數庫,來上傳檔案到Firebase storage。



firebase-admin是一套Node.js函數庫,提供是後端程式碼操作之用,而在操作的時候會需要用服務帳戶來進行與Firebase溝通。

1. 首先我們需要先從Firebase主控台將服務帳戶(Service Account)的金鑰下載回來

請進入https://console.firebase.google.com/,進入你的專案,接著點擊左側選單[專案總覽]右邊的齒輪 →點擊[專案設定]→點擊主頁中的[服務帳戶]分頁→點擊最下方的[產生新的私密金鑰]


2. 將下載回來的金鑰檔名改成serviceAccountKey.json

3. 確認已啟用firebase storage 並取得 bucket name 也就是下圖中滑鼠指的gs://開頭的內容

後續在程式中使用時不需要加入gs://前綴詞,一般來說會是與firebase專案名稱相同的。舉例來說,若firebase專案名稱是class-albums,這個firebase storage的bucket name就會是class-albums.appspot.com


接著我們就可以開始寫程式,使用firebase-admin上傳檔案到Firebase storage。


4. 建立Node.js專案

npm init

就只是個流程,懶惰的話就一直輸入Enter到完成

5. 安裝套件

npm i @mirochiu/firebase-storage-for-backend

這個套件提供簡單操作方便我們上傳檔案,套件的github程式碼庫在 https://github.com/Mirochiu/firebase-storage-for-backend

6. 新建主程式 index.js 檔案

// 載入serviceAccountKey
const serviceAccountKey = require('../serviceAccountKey.json');

// 引用@mirochiu/firebase-storage-for-backend套件
const createClient = require('@mirochiu/firebase-storage-for-backend');

// 引用讀取檔案的內建功能
const fs = require('node:fs');

// class-albums.appspot.com部份請依照你的bucket name修改
const client = createClient('class-albums.appspot.com', serviceAccountKey);

(async () => {
// 讀取電腦的本機檔案,這裡以package.json作為舉例
const fileContent = fs.readFileSync('./package.json');

// 將檔案內容上傳到firebase storage,並放在json目錄,命名為uploaded.json
const file = await client.upload('jsons/uploaded.json', fileContent);

console.log('upload done');

// 取得檔案的存取url
const url = await client.getFileUrl(file);
console.log('url: ' + url);

// 從firebase storage取回檔案,如果是json檔案可以透過getJson()取回
console.log(await client.getJson('jsons/uploaded.json'))
})();


7. 執行Node.js

在Console中輸入以執行上傳檔案的Node.js程式

node index.js


其他的操作

1. 查看套件的.d.ts定義

https://github.com/Mirochiu/firebase-storage-for-backend/blob/main/src/index.d.ts

2. Bucket API documentation

https://googleapis.dev/nodejs/storage/latest/Bucket.html


留言