2016-05-05 22 views
7

Ich habe versucht, die Antwort in diesem Post (How to Use Advanced Drive Service to Upload Files) zu befolgen, um mein Upload-Skript von der Verwendung von DriveApps in Drive API zu konvertieren, um das Hochladen großer Dateien zu ermöglichen um Dateien um 50 GB hochzuladen), aber ich hatte nicht viel Erfolg.Google Drive API zum Hochladen großer Dateien verwenden

Alles funktioniert gut, wenn ich relativ kleine Dateien hochlade (ich habe mit Dateien um 20 MB versucht), aber wenn ich versuche, eine größere Datei (ca. 400 MB) hochzuladen, passiert nichts.

ich folgende Fehler:

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

Ich dachte, die Drive API sollte mir erlauben, eine beliebige Größe Datei hochladen? Was mache ich falsch? Ich habe überprüft und die Drive API aktiviert. Jede Hilfe wird sehr geschätzt.

Mein server.gs Skript:

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(); 
    } 
} 

Mein 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> 
+0

@noogui Ich gehe davon aus, dass ich den einfachen Upload-Typ verwende. Ich bin mir nicht sicher, wie ich das in meinem Skript ändern könnte. – LJB

+0

Überprüfen Sie dieses [repo] (https://github.com/googledrive/cors-upload-sample), es könnte Ihnen einen Einblick geben. – noogui

+0

Ich bin mir nicht ganz sicher, aber "uploadType" ist irrelevant, da Sie den Advance Drive Service und nicht die Drive REST API verwenden. –

Antwort

3

Apps Script-Dienste auf einige Funktionen täglichen Quoten und harte Beschränkungen auferlegen.

Wenn Sie ein Kontingent oder eine Beschränkung überschreiten, löst Ihr Skript eine Ausnahme aus und beendet die Ausführung.

enter image description here

Während eine große Datei hochzuladen, die Skript Timeouts und damit werden Fehler zeigen.

Wenn Sie eine höhere Upload-Geschwindigkeit haben, können Sie mit einem Skript auch 400 MB hochladen.

Verwandte Themen