使用 Google Drive API 上传大文件

Using Google Drive API to upload large files(使用 Google Drive API 上传大文件)
本文介绍了使用 Google Drive API 上传大文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图按照这篇文章中的答案(

上传大文件时,脚本会超时,因此会显示错误.

同样,如果您有更高的上传速度,那么使用脚本上传 400MB 也是可能的.

I was trying to follow the answer in this post (How to Use Advanced Drive Service to Upload Files) to convert my upload script from using DriveApps to Drive API in order to allow large file uploads (I'll need to be able to upload files around 50 GB) but I haven't had much success.

Everything works fine when I'm uploading relatively small files (I've tried with files around 20 MB), but when I try and upload a larger file (around 400 MB), nothing happens.

I get the following errors:

POST 2601514732-mae_html_user_bin_i18n_mae_html_user.js:71 POST …3A1462412854269&fsid=4787eea0-1d3c-4fd8-b263-8bae40da182d&func=uploadFiles 413 ()

375182757-mae_html_driver_bin_i18n_mae_html_driver.js:113 GET …b263-8bae40da182d&token=AJuLMu2o9KnAOrSvzonQHNRGUelVpsakEg%3A1462412854269 500 ()

2601514732-mae_html_user_bin_i18n_mae_html_user.js:46 Uncaught NetworkError: Connection failure due to HTTP 500

I thought the Drive API was supposed to allow me to upload any size file? What am I doing wrong? I checked and I enable the Drive API. Any help is greatly appreciated.

My server.gs script:

 function doGet(e) {
   return template = HtmlService.createHtmlOutputFromFile('form.html');
   return template.evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME);
 }

 function uploadFiles(form) {

   try {

     var dropbox = "File Transfer";
     var folder, folders = DriveApp.getFoldersByName(dropbox);

     if (folders.hasNext()) {
       folder = folders.next();
     } else {
       folder = DriveApp.createFolder(dropbox);
     }


     //Upload file and set various properties
     var mediaData = form.File1;    
     var timeStamp = new Date();

     var resource = {
       description: "File uploaded on: " + timeStamp
     };

     var file = Drive.Files.insert(resource, mediaData); // create file using Drive API
     var fileId = file.id;    
     var DriveAppFile = DriveApp.getFileById(fileId); // retrieve file in DriveApp scope. 

     DriveApp.removeFile(DriveAppFile); // remove new file from Users root My Drive
     folder.addFile(DriveAppFile); // puts file in selected folder

     return "Thank you for your submission."

   } catch (error) {
     return error.toString();
   }
 }

My form.html:

<!DOCTYPE html>

<!-- You can also include your own CSS styles -->
<link href='https://fonts.googleapis.com/css?family=Bitter' rel='stylesheet' type='text/css'>

<div class="form-style-10">
<title>File Transfer </title>

<form id="myForm" name="myForm">
  <h1>  File Transfer </h1>
<p></p>

  <fieldset class="fields">
  <div class="section"> Files </div>
  <div class="inner-wrap">
    <label for="File1"> File 1 </label>
    <input type="file" name="File1" required />

  </div>
  </fieldset>

  <p>  </p>
  <p id="incompleteWarning" class="hideClass"> Please select a file to transfer. </p>
  <p id="bePatient" class="hideClass"> Please be patient while the file is being uploaded. Do not close or refresh the form. You will see a "transfer complete" message when the upload is finished.</p>

  <input id="submitbutton" type="button" value="Submit Application" />       
</form>

<div id="output" class="hideClass">
  <h1 id="TitleForm"> File Transfer </h1>
    <span id="ThankYou" >Transfer complete! If you need to transfer another file, you can use the same link again.
        </span>
</div>

</div>


<script type="text/javascript">

document.getElementById('submitbutton').addEventListener("click", validatefunction);

function validatefunction() {
   document.getElementById('submitbutton').val = 'Submitting...';
   //check for required fields
   var j = 0;
   var form = document.getElementById('myForm');
   var elem = form.elements;
   for (var i = 0; i < elem.length; i++){
     elem[i].className = "";
     if (elem[i].value === "" && elem[i].hasAttribute('required')){
       elem[i].className = "warning";
       j++;
    }
   }

   if (j === 0) {
       var btn = document.getElementById('submitbutton');
       btn.disabled = true;
       document.getElementById('incompleteWarning').style.display = 'none';
       document.getElementById('bePatient').style.display = 'inline';
           google.script.run.withSuccessHandler(fileUploaded).uploadFiles(this.parentNode);
    } else{
      document.getElementById('submitbutton').val = 'Submit Application';
      document.getElementById('incompleteWarning').style.display = 'inline';
      document.getElementById('incompleteWarning').style.color = 'red';
    }
};

</script>

<script>
    function fileUploaded(status) {
        document.getElementById('myForm').style.display = 'none';
        document.getElementById('output').style.display = 'inline';     
    }
</script>

<style>
 input { display:block; margin: 20px; }
</style>

解决方案

Apps Script services impose daily quotas and hard limitations on some features.

If you exceed a quota or limitation, your script will throw an exception and terminate execution.

While uploading a large file, the script time-outs and thus will show errors.

Again, if you have a higher upload speed then uploading 400MB might as well be possible using script.

这篇关于使用 Google Drive API 上传大文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)