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

May*_*ura 3 javascript google-apps google-apps-script

我的问题与此完全相同:使用doPost将文件上传到Google Web Apps

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

Tan*_*ike 9

无法通过本地PC上的HTML格式的GAS"doPost()"直接上传文件.因为"multipart/form-data"可能无法用于"doPost()".因此,如您所说,转换Base64会导致解决方案.

有两种方法可以通过"doPost()"上传文件.

1.在GAS项目上从HTML表单上传文件

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

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

这将在本地PC上从HTML表单上传文件.GAS控制"doPost()".在这种情况下,文件被编码为Base64并作为文本数据上载,然后使用GAS解码到文件.


1.在GAS项目上从HTML表单上传文件

规则:

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

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

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

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>
Run Code Online (Sandbox Code Playgroud)

脚本:

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Form.html');
}

function upload(e) {
  DriveApp.createFile(e.upFile);
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

对于HTML示例,在选择文件时上载文件.

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