使用 ajax 和 google app 脚本将文件上传到驱动器
Posted
技术标签:
【中文标题】使用 ajax 和 google app 脚本将文件上传到驱动器【英文标题】:Upload file to drive using ajax and google app script 【发布时间】:2016-02-17 15:09:06 【问题描述】:我正在尝试使用应用脚本编写代码以将文件(图像)上传到谷歌驱动器。 请通过代码。 我无法从 request.parameters 中取回文件。我尝试使用 formData 但它也不起作用。
我收到以下错误: 从请求参数接收到的文件对象是字符串类型,尽管 processData 为 false 或 拒绝从 'app script url' 执行脚本,因为它的 MIME 类型 ('text/html') 不可执行,并且启用了严格的 MIME 类型检查。
// Google App Script
function doPost(request)
var result;
// get folder from the drive
try
var dropbox = "tdsd";
var folder, folders = DriveApp.getFoldersByName(dropbox);
if (folders.hasNext())
folder = folders.next();
else
folder = DriveApp.createFolder(dropbox);
var parmKeys = Object.keys(request.parameters);
Logger.log(parmKeys);
//get file
var blob = request.parameters.file;
var file = folder.createFile(blob);
result =
status: 'success',
id: file.getId(),
url: file.getUrl(),
catch (error)
result = status: 'error', error: error, boo: parmKeys, level: '8';
return ContentService.createTextOutput(
request.parameters.prefix + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.javascript);
<form id="myForm">
<input type="text" placeholder="Your name.." id="myName">
<input type="file" name="myFile" id="myFile">
<input type="submit" value="Upload File" onclick="storeImage();">
</form>
<script>
function storeImage()
event.preventDefault();
var myName = document.getElementById('myName').value;
var file = document.getElementById('myFile').files[0];
$.ajax(
url: 'Google_Script_Url?prefix=JsonpCallback',
method: 'POST',
type: 'POST',
dataType: 'jsonp',
data:
file: file
,
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
mimeType: 'application/javascript',
success: function(results)
console.log(JSON.stringify(results));
,
error: function(results)
console.log(JSON.stringify(results));
);
</script>
【问题讨论】:
我复制了你的错误信息,但我不知道它是什么意思。我猜也许谷歌在他们的代码中放了一些东西来阻止 POST 请求。您可以使用google.script.run.serverFunctionName()
向服务器发送数据。 Google Documentation 我建议使用它而不是 AJAX 请求。
@SandyGood ,我无法使用 google.script.run.serverFunctionName() 函数,因为我需要在我的网站中使用应用脚本 url,不幸的是,谷歌不允许用户使用应用脚本iframe 中的网址。
好的,所以 AJAX 请求不在 Apps Script HTML Service 或 Google 站点中?我没有在常规网站上尝试过。
@RicK 嘿,我能知道你的解决方案吗?我和你有同样的问题,无法使用 AJAX/Fetch 的常规网站上的谷歌应用脚本上传文件
【参考方案1】:
您的 ajax 请求存在几个问题
jsonp 是 GET 请求而不是 POST,jsonp 是用来绕过同源策略的吗? 文件上传是通过 POST 请求而不是 jsonp 完成的通过 ajax 上传文件的基本方法是使用 FormData 对象
var myName = document.getElementById('myName').value;
var file = document.getElementById('myFile').files[0];
var data = new FormData();
data.append(myName, file);
$.ajax(
url: 'Google_Script_Url',
type: 'POST',
data: data,
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
success: function(results)
console.log(JSON.stringify(results));
,
error: function(results)
console.log(JSON.stringify(results));
);
【讨论】:
以上是关于使用 ajax 和 google app 脚本将文件上传到驱动器的主要内容,如果未能解决你的问题,请参考以下文章
如何将 AJAX 与 Google App Engine (Python) 结合使用
如何使用 Google Apps 脚本在个人 Google 云端硬盘和团队云端硬盘之间移动文件?
Google Apps 脚本和 Cloudbuild CI 登录
如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表