Опубликовать файл с UrlFetchApp в веб-приложении Google

#google-apps-script

#google-apps-script

Вопрос:

Я пытаюсь опубликовать любой тип файла с помощью скрипта Google Apps в веб-приложении, но я не знаком с doPost.

Мой код выглядит так:

 function call(){
  var file = getFile('/2.html');   //gets a file from my Google Drive (no point in posting all the code here for that)
  
  var options = {
  'method' : 'post',
    'payload' : {file : file}
  };
  
  var response = UrlFetchApp.fetch('https://script.google.com/macros/s/AKfycbx0aIU_XjOHPXh0P6y2dTMmvGpI6WAuac_Cq5BOGw7nDLRlodT-/exec',options)
  Logger.log(response)
  

Кажется, это работает, хотя я читал, что мне нужно, чтобы base64 кодировал файл, чтобы он работал правильно. Это то, чего я действительно не понимаю.

На стороне веб-приложения я сделал doPost (e), но независимо от того, что я пытался сделать с ‘e’, я не могу понять, что это за объект и как его обрабатывать. Все, что я хочу сделать на самом деле, это сохранить его на Google Диске.

Вам может быть интересно, почему я так долго отправляю файл на диск через веб-приложение, когда я мог бы сохранить его напрямую. Причина в том, что я пытаюсь выполнить процесс асинхронно, используя UrlFetchApp.fetchAll(), чтобы ускорить процесс записи большого количества файлов на диск одновременно.

Комментарии:

1. С чем вы пытались e ? На какую документацию вы ссылались до сих пор e ? Если да, какую часть или строку документации вам трудно понять?

2. Привет @theMaster Я пробовал: Utilities.newBlob((например,postData.contents), например,parameter.mimeType, например, parameter. имя файла); Я смог определить, что это file=[Ljava.lang . Object% Я попробовал его синтаксический анализ в формате JSON, но я получаю ошибку при первом символе. Я не нашел никакой документации о том, как анализировать файл с помощью doGet или doPost. Я нашел только документацию о том, как работать с текстом.

3. Если я отображаю e.parameters, то результатом будет просто [объект Object]

4. вы устали выполнять JSON.parse(x.getContentText ()) и проверьте эту ссылку, это что-то вроде того, что вы хотите сделать googleappscripting.com/json

5. @Doom Спасибо за это. Я решил это. Вы можете увидеть решение в другом потоке. На самом деле я передавал массив вместо файла, что усугубило мою первоначальную неспособность разобрать e .

Ответ №1:

Если переменная file имеет тип File , получите Blob из File и base64 закодируйте ее:

   var options = {
  'method' : 'post',
    'payload' : Utilities.base64EncodeWebSafe(file.getBlob().getBytes())
  };
  

В веб-приложении получателя расшифруйте его обратно:

 const doPost = e => {
  const file = DriveApp.createFile(
    Utilities.newBlob(
      Utilities.base64DecodeWebSafe(
        e.postData.contents
      )
    )
  )
}
  

Ответ №2:

Спасибо @TheMaster. Я внес некоторые изменения в код, потому что это привело к ошибке, поскольку требовалось имя файла. вам понадобится собственный URL-адрес веб-приложения apps script, чтобы перейти сюда [URL-адрес ВЕБ-приложения APPS SCRIPT]:

   const doPost = e => { 
    const file = DriveApp.createFile(
      Utilities.newBlob(
        Utilities.base64DecodeWebSafe(
          e.parameter.file
        ),e.parameter.contentType,e.parameter.fileName
      )
    )
  }






function sendFile(file){
  var fileName = file.getName();
  var contentType = file.getBlob().getContentType();
  var url = "[APPS SCRIPT WEB APP URL]";
  var payload = {
    fileName: fileName,
    contentType : contentType,
    file: Utilities.base64EncodeWebSafe(file.getBlob().getBytes())
  };
  var options = {
    method: "POST",
    payload: payload,
    muteHttpExceptions : true,
  };
  var res = UrlFetchApp.fetch(url, options).getContentText();
}