2019年7月18日 星期四

[GAS] 用 GAS 做中介以隱藏檔案真實來源位址,達成把檔案傳給用戶下載

因為對於原先的需求有了其他解決方案,沒空之下也就不再繼續研究這個議題了,整理一下之前的紀錄,以備日後自己查考(但很可能實際最後不管用)。內容不完整而且可能有錯誤,我自己也不曉得在寫什麼,請無意間進入閱讀的人小心喔。

在 Google Apps Script 端:
1. 從 Google Drive 取得 File 物件。
2. 用 DriveApp.File.getAs(contentType) 把檔案轉成 blob 物件。
3. 用 Blob.getBytes() 把 blob 轉成位元陣列(byte[])。
4. 用 Utilities.base64Encode(data) 把 Byte[] 轉成 Base 64 編碼的字串。
5. 回傳給用戶端的瀏覽器。

在用戶端瀏覽器開啟的網頁,由 JavaScript 接收 blob 物件,再由使用者選定存檔位置。


這篇文章試圖把檔案製作成 blob,以當作 GAS 的 doGet() 函式的 return 值,回傳給使用者的瀏覽器:
Serve PDF file as blob in Google Apps Script - Stack Overflow


這篇則試圖把伺服器傳來的 blob 物件,還原成 PDF 格式並存檔:
internet explorer - Save base64 string as PDF at client side with JavaScript - Stack Overflow


這個則使用比較新的程式寫法,也簡潔得多,但只處理到用戶端瀏覽器接收並轉為 blob :
Creating a Blob from a base64 string in JavaScript - Stack Overflow


這篇用的技術比較舊,但過程解釋的比較清楚:
HTML5筆記–Object URL-黑暗執行緒


在 DriveApp.File.getAs(contentType) 的官方說明中有提到,對大多數的 blob 而言,將 contentType 指定為 'application/pdf' 是唯一合法的選項。但我還是想試試不同類型,MDN整理了一份常見 MIME type 清單,並提及所有非純文字的檔案都可以使用 application/octet-stream 這個 MIME 類型。

沒有留言:

張貼留言

MJML完整語法說明

MJML 是一套由電子報服務商MailJet貢獻出來的開源框架,能用簡單的語法輕鬆撰寫響應式(RWD)的電子郵件內容,再透過免費開源的 轉檔程式 或 線上編輯器 ,產生最終的標準HTML程式碼。 上一篇 稍微針對其版面布局結構做了一點簡介,這篇就完整照著官網技術文件的內容(2...