使用 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 登录

集成 Plaid 和 Google Apps 脚本

如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表

要遵循哪个 OAuth 流程? (Google Apps 脚本和 Google Fusion Tables API)