如何通过 POST (doPost) 将文件上传到 Google 脚本的 Web 应用程序?
How to upload a file via POST (doPost) to a Google Script's Web App?
我的问题和这个问题完全一样:
如何从另一个域将文件直接上传到 Google 脚本的 Web 应用程序?我在那个问题中回答了一个解决方法,将文件转换为 base64 字符串,但问题仍然存在。是否可以将文件上传到 Google 脚本或仅字符串?
GAS 的"doPost()" 无法通过本地PC 上的HTML 形式直接上传文件。因为"multipart/form-data"可能无法用于"doPost()"。因此,转换 Base64 会导致如您所说的解决方案。
"doPost()".
上传文件有2种方式
1.从 GAS 项目
的 HTML 表单上传文件
这会在 GAS 项目中使用 GAS 和 HTML 上传文件。在这种情况下,文件不会通过脚本转换为 Base64。 (它可能会转换为内部过程。)
2。从本地 PC 上的 HTML 表单上传文件
这会从本地 PC 上的 HTML 表单上传文件。气体控制 "doPost()"。在本例中,文件被编码为Base64并作为文本数据上传,然后使用GAS解码为文件。
1。从 GAS 项目
的 HTML 表单上传文件
规则:
必须将以下示例脚本和 HTML 制作成 Google Apps 脚本的项目。
将 GAS 项目部署为 Web 应用程序。 https://developers.google.com/apps-script/guides/web 并检索 URL.
更新脚本后,必须更新为新版本。
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示例,选择文件时上传文件。
如果这对您有所帮助,我很高兴。
我的问题和这个问题完全一样:
如何从另一个域将文件直接上传到 Google 脚本的 Web 应用程序?我在那个问题中回答了一个解决方法,将文件转换为 base64 字符串,但问题仍然存在。是否可以将文件上传到 Google 脚本或仅字符串?
GAS 的"doPost()" 无法通过本地PC 上的HTML 形式直接上传文件。因为"multipart/form-data"可能无法用于"doPost()"。因此,转换 Base64 会导致如您所说的解决方案。
"doPost()".
上传文件有2种方式1.从 GAS 项目
的 HTML 表单上传文件这会在 GAS 项目中使用 GAS 和 HTML 上传文件。在这种情况下,文件不会通过脚本转换为 Base64。 (它可能会转换为内部过程。)
2。从本地 PC 上的 HTML 表单上传文件
这会从本地 PC 上的 HTML 表单上传文件。气体控制 "doPost()"。在本例中,文件被编码为Base64并作为文本数据上传,然后使用GAS解码为文件。
1。从 GAS 项目
的 HTML 表单上传文件规则:
必须将以下示例脚本和 HTML 制作成 Google Apps 脚本的项目。
将 GAS 项目部署为 Web 应用程序。 https://developers.google.com/apps-script/guides/web 并检索 URL.
更新脚本后,必须更新为新版本。
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示例,选择文件时上传文件。
如果这对您有所帮助,我很高兴。