Wie zum hochladen einer Datei per POST (doPost), um ein Google-Skript Web-App?

Meine Frage genau ist, wie diese: Hochladen einer Datei in einen Google-Web-Apps mit doPost

Wie zum hochladen einer Datei direkt, um ein Google-Skript, Web-App aus einer anderen Domäne? Ich antwortete, eine Abhilfe in dieser Frage, konvertieren Sie die Datei in einen base64-string, aber die Frage bleibt. Ist es möglich, eine Datei hochladen, um Google-Scripts oder nur die strings?

 

One Reply
  1. 7

    Dateien können nicht hochgeladen werden direkt von „doPost()“ von GAS aus dem HTML-Formular auf dem lokalen PC. Weil „multipart/form-data“ ist möglicherweise nicht in der Lage zu sein verwendet für „doPost()“. So Umwandlung von Base64-führt zu der Lösung, wie du sagst.

    Gibt es 2 Möglichkeiten zum hochladen von Dateien durch „doPost()“.

    1. Hochladen einer Datei aus HTML-Formular auf GAS-Projekt

    Diese eine Datei hochlädt, die mit GAS-und HTML-GAS-Projekt. In diesem Fall wird die Datei nicht umwandeln in Base64-durch das Skript. (Es konvertieren kann, wie der interne Prozess.)

    2. Hochladen einer Datei aus einer HTML-form auf dem lokalen PC

    Diese eine Datei hochlädt, die aus HTML-Formular auf dem lokalen PC. GAS controls „doPost()“. In diesem Fall, die Datei ist verschlüsselt und Base64-und upload von text-Daten, und dann decodiert, um die Datei mit GAS.


    1. Hochladen einer Datei aus HTML-Formular auf GAS-Projekt

    Regel :

    1. Folgende Beispiel-Skript und HTML gemacht werden müssen, in einem Projekt von Google Apps Script.

    2. Bereitzustellen, das GAS-Projekt als web-Anwendung. https://developers.google.com/apps-script/guides/web Und abrufen von URL.

    3. Nachdem Sie das Skript aktualisiert, Sie werden aktualisiert, sobald eine neue version.

    Form.html :

    <html>
      <body>
        <form>
          <input type="file" name="upFile">
          <input type="button" value="ok" onclick="google.script.run.upload(this.parentNode)">
        </form>
      </body>
    </html>

    Skript :

    function doGet() {
      return HtmlService.createHtmlOutputFromFile('Form.html');
    }
    
    function upload(e) {
      DriveApp.createFile(e.upFile);
    }

    2. Hochladen einer Datei aus einer HTML-form auf dem lokalen PC

    Die Regel ist fast das gleiche über eine. Das Skript platziert auf GAS-Projekt. Aber HTML-Formular platziert wird, auf dem lokalen PC.

    Skript :

    function doGet(e) {
      return message("Error: no parameters");
    }
    
    function doPost(e) {
      if (!e.parameters.filename || !e.parameters.file) {
        return message("Error: Bad parameters");
      } else {
        var data = Utilities.base64Decode(e.parameters.file, Utilities.Charset.UTF_8);
        var blob = Utilities.newBlob(data, MimeType.PNG, e.parameters.filename);
        DriveApp.createFile(blob);
        return message("completed");
      }
    }
    
    function message(msg) {
      return ContentService.createTextOutput(JSON.stringify({result: msg})).setMimeType(ContentService.MimeType.JSON);
    }

    HTML :

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
    </head>
    <body>
        <input type="file" id="file">
    
        <script type="text/javascript">
            $(function(){
                var url = 'https://script.google.com/macros/s/[Project ID]/exec';
                var params = {
                    filename: 'samplefile',
                    imageformat: 'PNG'
                };
    
                $('#file').on("change", function() {
                    var file = this.files[0];
                    var fr = new FileReader();
                    fr.onload = function(e) {
                        params.file = e.target.result.replace(/^.*,/, '');
                        postJump();
                    }
                    fr.readAsDataURL(file);
                });
    
                function postJump(){
                    var html = '<form method="post" action="'+url+'" id="postjump" style="display: none;">';
                    Object.keys(params).forEach(function (key) {
                        html += '<input type="hidden" name="'+key+'" value="'+params[key]+'" >';
                    });
                    html += '</form>';
                    $("body").append(html);
                    $('#postjump').submit();
                    $('#postjump').remove();
                }
            });
        </script>
    </body>
    </html>

    Diesem Beispiel-Skript nimmt an, laden Sie eine PNG-Datei als test. Wenn Sie wollen, so wie andere Dateien hochgeladen, bitte ändern Sie den mime-Typ. https://developers.google.com/apps-script/reference/base/mime-type

    Für HTML-Beispiel, die Datei wird hochgeladen, wenn Sie die Datei ausgewählt ist.

    Wenn dies hilfreich sein für Sie, ich bin froh.

    • Danke für die Klarstellung. Ich weiß schon, über base64 Dateien aber nicht sicher, ob der direkte Datei-Upload erlaubt war
    • dies ist enorm hilfreich, wie ist dein blog. Vielen Dank für Ihre tolle Arbeit!
    • Willkommen. Ich danke Ihnen für Ihren Besuch auf meinem blog, auch.
    • die einzige Frage die ich habe ist: warum verwenden Sie .replace(/^.*,/, '') auf die input-Daten? Ich wäre sehr dankbar für jeden Einblick, den Sie bieten können, auf diese Frage.
    • Wenn Daten verschlüsselt und Base64,um entfernen Sie die überflüssigen Teile und verwenden Sie es als ein blob verwendet wird.
    • Wenn ich die erste e-Technik.upFile ist nur einen 10-byte-text-Datei – „FileUpload“. Wo ist die Datei Weg??
    • Roberts-ich entschuldige mich für die Unannehmlichkeiten. In meinem Umfeld konnte ich bestätigen, dass die text-Datei mit der Größe von 10 bytes, die hochgeladen werden können, und erstellt auf root-Ordner (DriveApp.createFile(e.upFile) erstellt die Datei in root-Ordner als den Standardwert.) als text-Datei. Ich bin wirklich Leid, dass ich konnte nicht replizieren Ihre situation. Kann ich Sie bitten, über die Methode, die für die Replikation Ihrer situation?
    • Danke für die Antwort. Wenn ich kopiert dein code verbatim es geklappt hat 🙂 Muss fehlt etwas in mir irgendwo. Danke.
    • Roberts Danke für das testen es erneut. Ich bin froh, dass es funktionierte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.