【发布时间】:2019-08-20 15:57:40
【问题描述】:
表单标题下的 Google support article 示例已损坏。来自文章:
如果您以表单元素作为参数调用服务器函数,则表单将成为单个对象,其中字段名称作为键,字段值作为值。这些值都被转换为字符串,除了文件输入字段的内容,它们变成了 Blob 对象。
我通过传递一个包含 5 个文本输入和一个文件的表单元素来测试这一点,然后在表单对象上记录 Object.keys()。它仅返回 5 个文本字段,该文件已从表单对象中剥离。尝试分配文件 blob 直接返回Exception: Invalid argument: blob
如何将文件 blob 从客户端表单传递到服务器端 Apps 脚本?
编辑:为了澄清,我还逐字复制粘贴了 Google 提供的示例。它与Exception: Invalid argument: blob 出错。
复制:
- 创建新的 Google Apps 脚本项目
- Index.html 内容:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
// Prevent forms from submitting.
function preventFormSubmit() {
var forms = document.querySelectorAll('form');
for (var i = 0; i < forms.length; i++) {
forms[i].addEventListener('submit', function(event) {
event.preventDefault();
});
}
}
window.addEventListener('load', preventFormSubmit);
function handleFormSubmit(formObject) {
google.script.run.withSuccessHandler(updateUrl).processForm(formObject);
}
function updateUrl(url) {
var div = document.getElementById('output');
div.innerHTML = '<a href="' + url + '">Got it!</a>';
}
</script>
</head>
<body>
<form id="myForm" onsubmit="handleFormSubmit(this)">
<input name="myFile" type="file" />
<input type="submit" value="Submit" />
</form>
<div id="output"></div>
</body>
</html>
- Code.gs 内容:
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index');
}
function processForm(formObject) {
var formBlob = formObject.myFile;
var driveFile = DriveApp.createFile(formBlob);
return driveFile.getUrl();
}
- 作为网络应用发布
- 使用任何文件提交表单
- 在视图中观察错误 -> Stackdriver 日志记录 -> Apps 脚本仪表板
【问题讨论】:
-
如文档所述,您应该发送表单
element而不是表单object -
我用错了词...我更新了问题。我通过了 HTML 表单元素。
-
展示你是如何用代码传递元素的。提供minimal reproducible example。这是
Exception: Invalid argument: blob.客户端还是服务器端? -
您的代码在我上传 .pdf 文件的测试中完美运行。您上传的文件的 MIME 类型是什么?
-
@AndresDuarte 我尝试了各种(txt、xlsx、png),没有任何效果。听到完全相同的代码适用于其他人现在让我相信我的公司存在某种公司限制。 (◔_◔)