Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

使用 GAS 建立檔案上傳後端

內容目錄

使用 GAS 建立檔案上傳後端

之前建立了一組 LIFF + GAS API 的問卷流程,後續出現了需要上傳圖片的需求,結果發現一樣可以透過 GAS 去對 Google Drive 存取,就稍微改造了一下XD

這篇僅記錄 GAS 端接收圖片資料後的處理。

圖像 Blob 化

需要先拆解接收的 base64 字串,原本長得像「data:image/png;base64, xxxxxxxxx」要把 data:image/png;base64 拆掉,剩下後面的 base64 字串。

拆解完後再重新建立 blob 物件(Binary Large Object)

const base64String = imageBlobstring.split(';base64,').pop();
const imageBlob = Utilities.newBlob(Utilities.base64Decode(base64String), 'image/png','test.png');//需要指定檔名
const image = imageBlob;

直接建立檔案

記得要先開放 Google Drive 的存取權限,開放給所有人編輯

file = Drive.Files.create(file, image, {'fields': 'id,size'});

指定資料夾

如果不調整資料夾,則會在 Google Drive 的根目錄,當然不太可能這樣做,因此要調整資料夾位置

// 取得資料夾
//https://drive.google.com/drive/u/0/folders/<FolderId> 記得要開權限
var folder = DriveApp.getFolderById('<FolderId>'); 

// 在資料夾中創建文件
var createdFile = folder.createFile(image);

全部程式碼

function uploadFile(imageBlobstring) {
  try {
    // Makes a request to fetch a URL.
    //const image = UrlFetchApp.fetch('http://goo.gl/nd7zjB').getBlob();
    const base64String = imageBlobstring.split(';base64,').pop();

    const imageBlob = Utilities.newBlob(Utilities.base64Decode(base64String), 'image/png','test.png');//需要指定檔名
    Logger.log(imageBlob);
    const image = imageBlob;
    let file = {
      name: 'google_logo.png',
      mimeType: 'image/png'
    };
    // // Create a file in the user's Drive.
    // file = Drive.Files.create(file, image, {'fields': 'id,size'});
    // 獲取資料夾
    var folder = DriveApp.getFolderById('1JOGpsxxAD8ijbT3hIjFATE2daRvaKVN4');

    // 在資料夾中創建文件
    var createdFile = folder.createFile(image);

    Logger.log('ID: %s, File size (bytes): %s', createdFile.getId(), createdFile.getSize());
  } catch (err) {
    // TODO (developer) - Handle exception
    Logger.log('Failed to upload file with error %s', err.message);
  }
}