如何在对 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 批处理请求