Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Google Drive API to upload large files

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>
like image 566
LJB Avatar asked May 05 '16 01:05

LJB


1 Answers

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.

enter image description here

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.

like image 118
Suyash Gandhi Avatar answered Sep 29 '22 07:09

Suyash Gandhi