使用谷歌应用脚本上传后文件损坏 - >上传页面



我准备了一个简单的谷歌应用程序脚本和上传表单,允许我没有谷歌帐户的朋友上传一些文件(不同类型-图片、docx、png等;相当小的文件-低于10MB(

function doGet(e) {
return HtmlService.createHtmlOutputFromFile('form.html');
}
function uploadFiles(form) {
try {
var mainFolder = "Tmp_Uploads";
var folder = DriveApp.getFoldersByName(mainFolder).next();
var file = folder.createFile(form.myFile);

return "File uploaded successfully " + file.getUrl();
} catch (error) {
return error.toString();
}
}

机制工作->上传文件后显示在我的";Tmp_Uploads";文件夹。但是当我把它下载到我的电脑上时->文件已损坏。

我用.jpg、.png、.doc测试了它,但它们都坏了——无法打开它们(它们的大小也与原来的不同(。

当我上传简单的.txt文件时->它运行良好。

质量:

  1. 怎么了
  2. 我能以某种方式恢复用上述机制上传的文件吗?下载到PC后解码或进行后处理以打开它

提前干杯并表示感谢!

在调用谷歌脚本uploadFiles((函数之前,请在html中尝试此Javascript函数。

<script>
function uploadFile(form) {
const file=form.File.files[0];
const fr=new FileReader();//all this FileReader code originally came from Tanaike
fr.onload=function(e) {
const obj={filename:file.name,mimeType:file.type,bytes:[...new Int8Array(e.target.result)]};
google.script.run.uploadFiles(obj);
}
fr.readAsArrayBuffer(file);
}
</script>

然后你的谷歌脚本函数看起来像这样:

function uploadFiles(form) {
var mainFolder = "Tmp_Uploads";
var folder = DriveApp.getFoldersByName(mainFolder).next();
var blob = Utilities.newBlob(form.bytes, form.mimeType, form.filename);
var file=folder.createFile(blob); 
return "File uploaded successfully " + file.getUrl();
}

示例

参考

如果你的表单中有更多的数据,而不仅仅是一个文件上传,那么看看这个例子。

<script>
function uploadFile(form) {
console.log('form.elements.Destination.value= %s',form.elements.Destination.value);
console.log('format.elements.FileName.value= %s',form.elements.FileName.value);
$('#msg').css('display','block');
$('#msg').html('UpLoading...Please Wait');
const file=form.File.files[0];
const fr=new FileReader();//all this FileReader code originally came from Tanaike
fr.onload=function(e) {
const obj={FileName:form.elements.FileName.value,Destination:form.elements.Destination.value,mimeType:file.type,bytes:[...new Int8Array(e.target.result)]};//this allowed me to put the rest of the Form.elements back into the object before sending it to google scripts
google.script.run
.withSuccessHandler(function(msg){
$('#msg').css('display','block');
$('#msg').html(msg);//I returned a message after the download 
})
.uploadFile(obj);
}
fr.readAsArrayBuffer(file);
}
</script>

<form>
<br /><select id="sel1" name="Destination"></select> Upload Destination
<br /><input type="text" name='FileName' /> File Name
<br /><input type="file" name='File'; />
<br /><input type="button" value="Upload" onClick="uploadFile(this.parentNode);" />
<br /><input type="button" value="Close" onclick="google.script.host.close();" />
<div id="msg"></div>
</form>

最新更新