Javascript 使用应用程序脚本将图像上载到Google Drive

Javascript 使用应用程序脚本将图像上载到Google Drive,javascript,google-apps-script,google-drive-api,filereader,Javascript,Google Apps Script,Google Drive Api,Filereader,我试图创建一个函数,从用户的本地内存上传一个图像,并将其发送到GoogleDrive连接的应用程序脚本中。我似乎能够与驱动器和文件进行交互,但每当我上传图像时,谷歌驱动器中都有一个名称正确的文件,但它不是图像,它看起来像一个包含图像所有数据的文本文件 我似乎不知道哪里出了错,哪里出了问题。如果有人甚至可以给我一些我需要学习或阅读的东西的提示,这样我就可以发现自己的错误,或者给我答案,无论哪种方式,我只想知道我错在哪里:) 谢谢你的帮助 我阅读了FileReaderAPI上的文档,认为我没有正确使

我试图创建一个函数,从用户的本地内存上传一个图像,并将其发送到GoogleDrive连接的应用程序脚本中。我似乎能够与驱动器和文件进行交互,但每当我上传图像时,谷歌驱动器中都有一个名称正确的文件,但它不是图像,它看起来像一个包含图像所有数据的文本文件

我似乎不知道哪里出了错,哪里出了问题。如果有人甚至可以给我一些我需要学习或阅读的东西的提示,这样我就可以发现自己的错误,或者给我答案,无论哪种方式,我只想知道我错在哪里:)

谢谢你的帮助

我阅读了FileReaderAPI上的文档,认为我没有正确使用onloadend事件,我尝试将图像转换为blob和字符串,并尝试从中创建文件

函数addImageToDrive(){
var file=$('#capture')[0]。文件[0];
var reader=new FileReader();
reader.readAsDataURL(文件);
reader.onloadend=函数(e){
google.script.run
.withSuccessHandler()
.withFailureHandler(errorAlert)
.uploadfiletogologledrive(“regNo”,“Test”,e.target.result);
});
}

照片

function uploadfiletologledrive(regNo,fileName,data){
试试{
var regFolder=checkifforderexists(regNo);
//var blob=DriveApp.createFile(“测试文件”,数据);
var contentType=data.substring(5,data.indexOf(“;”),
字节=实用程序.base64Decode(data.substr(data.indexOf('base64',)+7)),
blob=Utilities.newBlob(字节、contentType、regNo+fileName);
DriveApp.getFolderById(regFolder.createFile)(blob);
Logger.log(“完成”);
返回“OK”;
}渔获物(f){
Logger.log(f.toString());
返回f.toString();
}
}    

它可以工作,但上传的结果文件不是图像。

addImageToDrive函数的最后一行中有一个额外的
,这可能是导致问题的原因。

您需要上传arraybuffer中的数据,而不是二进制大对象
var fileContent = 'sample text'; // As a sample, upload a text file.
var file = new Blob([fileContent], {type: 'text/plain'});
var metadata = {
'name': 'sampleName', // Filename at Google Drive
'mimeType': 'text/plain', // mimeType at Google Drive
'parents': ['### folder ID ###'], // Folder ID at Google Drive    
};

var accessToken = gapi.auth.getToken().access_token; // Here gapi is used for 
retrieving the access token.
var form = new FormData();
form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 
'application/json' }));
form.append('file', file);

fetch('https://www.googleapis.com/upload/drive/v3/files? 
uploadType=multipart&fields=id', {
method: 'POST',
headers: new Headers({ 'Authorization': 'Bearer ' + accessToken }),
body: form,
}).then((res) => {
return res.json();
}).then(function(val) {
console.log(val);
});
var-blob//图像数据
var图像大小//图像大小
var reader=new FileReader();
reader.readAsArrayBuffer(blob).then((响应)=>{
var viewArraybuffer=新的Uint8Array(响应);
var xhr=new XMLHttpRequest();
xhr.open(“POST”https://www.googleapis.com/upload/drive/v3/files?uploadType=media“,对);
setRequestHeader(“Authorization”,Bearer${token.accessToken}`);
setRequestHeader(“内容类型”,“image/png”);
setRequestHeader(“内容长度”,图像大小);
})
发送(viewArrayBuffer);
xhr.onreadystatechange=函数(){
如果(xhr.readyState==4&&xhr.status==200){
console.log(xhr.responseText);
}

}
如果
checkifforderexists(regNo)
返回有效的文件夹ID,我认为您的脚本可以工作。那么,您能否提供完整的脚本和示例图像来复制您的情况?通过这一点,我想确认一下。当然,请删除您的个人信息。我测试了您的代码,仅更改regFolder以获得有效的文件夹Id,并且工作正常。我上传了.png和.jpeg图像到硬盘,我可以在浏览器中打开它们。请提供一个示例图像。