如何在对 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 脚本的发布请求中捕获上传的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Apps 脚本中使用服务帐户对 Google 表格进行身份验证

如何使用 Google Apps 脚本执行 API + Java 创建 Google 表单?

Google Apps 脚本中的 POST 请求和 405 错误

使用 Google Apps 脚本的 Facebook API 批处理请求

如何向 Google Apps Script Web App 发送有效的 HTTP 请求?

带有 GraphQL 解析错误的 Google Apps 脚本 API 请求