如何在对 Google Apps 脚本的发布请求中捕获上传的文件?

Posted

技术标签:

【中文标题】如何在对 Google Apps 脚本的发布请求中捕获上传的文件?【英文标题】:How to capture uploaded file in post request to Google Apps Script? 【发布时间】:2020-10-27 19:09:37 【问题描述】:

我正在尝试构建一个脚本来保存 html 表单(不是 Google 表单)中的数据(文本 + 图像 + pdf)。

我有以下功能来上传文件:

function upload(x) 
  var destination_id = 'folder_id'
  var destination = DriveApp.getFolderById(destination_id)
  
  var contentType = 'image/png'
  var img = x.getAs(contentType)
  destination.createFile(img)

在我的doPost 函数中,我像这样调用上面的上传函数:

upload(e.parameter.img)

我有一个 file 类型的输入,其名称和 ID 为 img。我还有以下事件侦听器来准备 POST 请求的主体:

form.addEventListener('submit', e => 
      e.preventDefault()
      let fd = new FormData(form)
      
      fetch(scriptURL,  method: 'POST', body: fd)
        .then(response => console.log('Success!', response))
        .catch(error => console.error('Error!', error.message))
    )

当我提交表单时,我的文本被保存,但文件没有上传。我也没有在控制台中看到任何错误。我究竟做错了什么?除了将表单数据上传到 Google 云端硬盘之外,还有其他更简单的方法吗?

【问题讨论】:

我认为您没有在 Web 应用程序端正确检索数据。 e.parameter.img 将从 url 参数 img 中获取数据,例如,它将等于 url https://script.google.com/a/domain/macros/s/XXXXXXXXXXXX/exec?img=sometext 的字符串 sometext。帖子数据应该在e.parameters.data 中,但您需要使用Utilities.base64Decode(e.parameters.data) 对其进行解码。你能确认一下吗? 可以看到请求参数列表here @RafaGuillermo 所以该行将是 upload(Utilities.base64Decode(e.parameters.img[0])) ?既然e.parameters 返回值数组? 我认为e.parameters.img 在查看您的代码 sn-ps 时将是空的。你能把e的内容记录下来并粘贴吗? @RafaGuillermo 更新:还是一样。在 chrome 开发工具的网络选项卡中,表单数据显示 img: (binary)。所以我认为文件正在被传递到后端。 【参考方案1】:

type=file 目前似乎不受支持。您可以在客户端使用FileReader api 来解决此问题,将文件数据转换为base64 编码的网络安全字符串,并将数据作为string 或字节数组发送。

Related answer

【讨论】:

有没有教程可以建议您使用 FileReader API 处理文件上传? @MiniGunnR 相关的答案链接是一个很好的示例。我没有将这个问题作为重复问题关闭的唯一原因是因为该客户端是 Google 网络应用程序,而您的客户端是不同的网络应用程序。无论如何脚本应该几乎相同,除了google.script.run部分必须更改为fetch

以上是关于如何在对 Google Apps 脚本的发布请求中捕获上传的文件?的主要内容,如果未能解决你的问题,请参考以下文章