如何通过POST(doPost)将文件上传到Google Script的Web App?

时间:2017-02-14 02:51:57

标签: javascript google-apps-script google-apps

我的问题与此完全相同:Upload a file to a Google Web Apps with doPost

如何将文件从其他域直接上传到Google Script的Web App?我在该问题中回答了一个解决方法,将文件转换为base64字符串,但问题仍然存在。是否可以将文件上传到Google脚本或仅上传字符串?

1 个答案:

答案 0 :(得分:7)

文件不能由" doPost()"直接上传在本地PC上从HTML表单获取GAS。因为" multipart / form-data"可能无法用于" doPost()"。因此,正如您所说,转换Base64会导致解决方案。

有两种方法可以通过" doPost()"。

上传文件

<强> 1。从GAS项目的HTML表单上传文件

这在GAS项目中使用GAS和HTML上传文件。在这种情况下,文件不会被脚本转换为Base64。 (它可以转换为内部流程。)

<强> 2。从本地PC上的HTML表单上传文件

这将在本地PC上从HTML表单上传文件。 GAS控制&#34; doPost()&#34;。在这种情况下,文件被编码为Base64并作为文本数据上传,然后使用GAS解码为该文件。

1。从GAS项目

上的HTML表单上传文件

规则

  1. 以下示例脚本和HTML必须成为Google Apps脚本的项目。

  2. 将GAS项目部署为Web应用程序。 https://developers.google.com/apps-script/guides/web并检索网址。

  3. 更新脚本后,必须将其更新为新版本。

  4. 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>
    

    脚本

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

    2。从本地PC上的HTML表单上传文件

    规则几乎与上面的规则相同。该脚本放在GAS项目中。但HTML表单放在本地PC上。

    脚本

    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>
    

    此示例脚本假设将PNG文件上载为测试。如果要上传其他文件,请更改mime类型。 https://developers.google.com/apps-script/reference/base/mime-type

    对于HTML示例,在选择文件时上传文件。

    如果这对你有帮助,我很高兴。