Web应用自动导入文件至Google Drive失败问题求助
问题分析与修复方案
你的代码存在两个核心问题,导致文件无法正确上传到Google Drive:
1. 字段名不匹配
前端构造的上传对象中,字节数据存储在bytes字段,但后端uploadFiles函数里尝试读取data.data,字段名完全不对应,这会直接导致data.data为undefined,进而引发Utilities.base64Decode的错误。
2. 字节数据处理方式错误
前端将ArrayBuffer转换为Int8Array数组后传递给后端,但Utilities.base64Decode要求输入的是base64编码字符串,而非原始字节数组,这会导致解码失败。
修正后的完整代码
前端HTML/JS部分(Index.html)
<!DOCTYPE html> <html> <head> <base target="_top"> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> </head> <body> <input type="file" id="idInput" onchange="test(idInput)"> </body> <script> function test(photo){ var file = photo.files[0]; // 直接用传入的photo元素,无需再通过ID获取 console.log("file content :"); console.log(file); const fr = new FileReader(); fr.onload = function(e){ // 将ArrayBuffer转换为base64字符串 const base64Str = btoa(String.fromCharCode(...new Uint8Array(e.target.result))); const obj = { filename: file.name, mimeType: file.type, base64Data: base64Str // 改用base64字符串传递 }; console.log("obj content :"); console.log(obj); google.script.run.withSuccessHandler(() => { console.log("文件上传成功"); }).withFailureHandler((err) => { console.error("上传失败:", err); }).uploadFiles(obj); }; fr.readAsArrayBuffer(file); } </script> </html>
后端Google Apps Script部分(Code.gs)
function doGet(){ return HtmlService.createHtmlOutputFromFile("Index"); } function uploadFiles(data) { // 用正确的字段名读取base64数据,同时使用原始文件名 const myFile = Utilities.newBlob( Utilities.base64Decode(data.base64Data), data.mimeType, data.filename ); const folder = DriveApp.getFolderById("1yYgC7KCdmVLYjvHutCDqHyKGnevc64rr"); folder.createFile(myFile); }
关键修改说明
- 前端:将
ArrayBuffer转换为base64字符串(通过btoa和Uint8Array实现),并将字段名改为base64Data,同时简化了文件获取逻辑(直接使用传入的DOM元素)。 - 后端:修正字段名为
data.base64Data,并使用前端传递的原始文件名data.filename,而非硬编码的"test"。 - 新增了
withFailureHandler用于捕获并打印上传过程中的错误,方便后续调试。
内容的提问来源于stack exchange,提问作者DAM
相关产品推荐
相关产品推荐

