HTTP POST和Google Apps脚本文件上传

3

非常抱歉,如果这个问题有重复,请谅解。经过多小时的搜索仍然没有结果,我决定向社区提问:

是否有任何方法,使用以下带有HTML和JavaScript的表单(使用POST或GET请求),使用户能够从普通HTML页面提交并上传文件到Google Drive,通过将“form action =”指向Google脚本实现?

我已经成功地将值写入Google电子表格,只使用一个指向包含单个doPost(e)的Google脚本的表单操作,然后抓取e.parameter.[input_field_name_here]并执行计算。

我一直在尝试各种方法,但目前为止,我的进展还很有限。

当前HTML:

<form method="post" action="my_google_script_published_as_web_app_url/exec" name="quoteForm" id="quoteForm" target="hidden_iframe"> 
  <input type="file" name = "thefile">
</form> 

Google Apps Script

function doPost(e) 
   {
   var fileBlob = e.parameter.thefile;
   Logger.log(e);
   Logger.log(fileBlob);
   var doc = DocsList.createFile(fileBlob.getBlob());
   }

我尝试了以下几种方法来尝试通过此方法进行上传:

  • enctype="multipart/form-data"添加到表单中,以查看是否存在问题。
  • 尝试使用“GET”请求。

在可用结果方面,最接近的是一个错误返回:“无法将数组转换为BlobSource”,以及进一步的结果:“无法在字符串类型上调用 .getBlob()”,以及“...在对象类型上”。

这有希望吗? 我一直在尝试从这里和以下两个问题中搜集信息,这两个问题涉及与此类似的方法的错误,分别是 这里这里,后者似乎最接近我的情况。

非常感谢您提前对此事的任何帮助。

2个回答

1
我认为这仍然是“有缺陷的”。我不知道是否打算保持这种状态。经过一些详尽的试验和错误,我得出结论,虽然可能会执行doPost,但你永远无法获得可用的响应(我想不出一种情况,在这种情况下你不关心上传是否成功)。基本上,你会遇到跨域问题,这在htmlService example中已经为你解决了。“get”将永远无法用于上传。

David,当你说“对你解决了”时,是否意味着通过使用你链接的页面中展示的“表单”示例,可以从简单的、独立的非 Google 脚本 HTML 页面中工作?如果是这样,那么该表单如何“指向”我的 doPost,以等待 Google 脚本处理来自表单的传入数据? - Jonathan LeRoux
不,你不能用那种方式使doPost工作。我的做法是创建一个基于htmlService的Web应用程序,在doGet中返回表单,并在服务器端函数中处理上传,遵循示例模式。这是由托管的HTML页面和JS处理的一系列操作的一部分,除了此上传操作外,所有模态表单都是如此。对于此上传操作,我会打开一个新的页面/选项卡并运行上传Web应用程序脚本。 - DavidF

0
由于近年来的变化,您可以使用DriveApp指定contentType并将其保存到云中:
  var contentType = 'image/jpeg';
  var img = e.imageFile;
  var img = img.getAs(contentType);
  var destination = DriveApp.getFolderById(destination_id);
  destination.createFile(img);

请确保您的HTML代码正常工作。您还没有指定任何提交输入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接