跳到主要內容

Cloud APP上傳檔案與下載策略

在Cloud APP上傳檔案與下載時,因為顧及到主機Scale out時候檔案存放位置會影響到Scale out出來的主機如何存取新上傳的檔案,在雲端,透過Cloud Storage是一個不錯的解決方案...

Node.js跟許多語言在file upload的處理方式有點不同,以Express為例,我們可以透過app.use()來導入其他的模組作為控管檔案上傳的部分,而我最常使用的是multr這個模組... 這次透過一些改寫,希望基於multr讓上傳、下載的動作直接結合Cloud Storage來作為存取的位置。

下面這是整個上傳與下載的示意圖:



上圖分成兩個部分:
  • 上傳的部分,無論如何直接將一份副本複製到Cloud Storage
  • 下載的部分,主要依循幾個策略:
    • 如果本地端有檔案,則直接使用本地端檔案回覆
    • 如果本地端無檔案,系統直接到Cloud Storage拉檔案
    • 承上,如果使用者允許cache,可以在拉完Cloud Storage檔案後,在存放一個副本在本地端,之後就可以支援從本地端存取功能
上面所述,因為效能關係,可能會開啟cache的功能,如果上傳的檔案名稱不是唯一,則可能重複上傳後再本地端會有舊資料問題,為了避免這個問題,在設定檔中可以指定上傳時候不維持原檔名,這樣每次上傳會以重新編碼檔名,讓每一個物件名稱不會重複。

安裝

npm install express-gcs-uploader --save

設定

Step1: 與Cloud Storage認證部分設定

var gcsuplder = require('express-gcs-uploader');
gcsuplder.auth({
  rootdir: __dirname, //設定專案目錄位置,在這邊是為了對應uploads目錄用
  upload_url: '/uploads', //上傳檔案的資料夾
  download_url: '/download', //檔案下載的路由
  cdn_url: 'http://your.bucket.com.tw', //option: 如果GCS設定為public或是website buket,則可以直接由此位置提供服務
  keep_filename: true, //option: 是否保留原本檔案名稱
  cache: true, //option: 是否每次下載完儲存一份在本地端
  bucket: 'your.bucket.com.tw', //GCS bucket名稱
  projectId: 'your-project-id', //GCP專案名稱
  keyFilename: '/path/to/your/key.json' //Service Account的json key位置
});
Step2: 設定下載的route使用downloadproxy
app.use('/downloads/:id', gcsuplder.downloadproxy);
如上設定,則可以在下面網址存取一個上傳的檔案: http://localhost:3000/downloads/e13b6a98a0d50b5990123a83eb87f2a8.png 
其中,“:id”到時候帶入的會是檔案名稱。

上述模組,發佈在Github給大家參考:https://github.com/peihsinsu/express-gcs-uploader

留言

這個網誌中的熱門文章

透過Google Apps Script結合Google Form做即時郵件通知

體驗過Google Apps Script的功能後,也發現他結合GmailApps的模組 GmailApps的應用可以用在表單填寫完成後,做發信的通知 例如您開立了一個訂購的表單,為了要在第一時間通知商家有訂單進入 就可以直接呼叫Gmail做發信的通知,讓手持Smart Phone的我們可以很快的知道生意上門了! 下面規劃三個function,其中: onCommit():為form commit時候觸發的function,需要掛載於form commit trigger上 jsonArrToTable():目的將json array解析成為一個Table getLastRowTable():目的將整個table的回傳過濾為剩下第一筆(表頭,含有Form的欄位說明)與最後一筆(原則上就是剛剛送出的那一筆表單) 完整程式碼如下: function onCommit(){   var sheet = SpreadsheetApp.getActiveSheet();   var rows = sheet.getDataRange();   var numRows = rows.getNumRows();   var values = rows.getValues();   var content = getLastRowTable(values);   var htmlBody = "Hi Admin: <br/><br/>有訂單拉,檢查一下吧! <br/><br/>" + content + '<br/><br/>Send by Google Apps';   GmailApp.sendEmail(     " your-email-address@gmail.com ",      "Order Confirm Notice",      htmlBody,      {from: ' from-email-...

Share a chrome plugin for manage google cloud platform

好玩意兒報報.... 同事的新作,把Google Project List在Chrome Plugin中! 對一次管理多個專案的人來說,真得超方便的拉! 下載: https://chrome.google.com/webstore/detail/gdclauncher/bicgkglnnilldakpenngnblekooejnpg 使用說明: 1. Use browser url bar to quick search: Type "gdcl" in browser Press "TAB" to start search Type the project id key word then select the search result... 2. Using quick launch bar... You can search by keyword or click project name to go to the project or gae link to go to gae or go to billing page....

Cloud Monitor嚐鮮

GCP上,我們非常想要的一個功能,終於問世.... Cloud Monitor來了!