从Web应用上传视频至Google Drive出现0字节问题求助
问题解决:Web应用向Google Drive上传视频文件0字节问题
文档上传功能正常,但视频上传后文件为0字节,核心问题在于二进制数据处理逻辑错误:
- 视频处理时错误地将
File对象直接传入Uint8Array,而非读取后的ArrayBuffer - 将二进制数据转成普通字符串传输,导致二进制信息丢失,服务端无法正确解码
以下是修正后的完整代码:
绑定按钮的事件函数
async function uploadVideoFile(){ let input = document.getElementById('upload-video'); let file = input.files[0]; let res = await getFiles(file).catch(err => alert(err.message)); google.script.run .withSuccessHandler(response => { // 可添加上传成功后的逻辑 }) .withFailureHandler(response => { // 可添加上传失败后的逻辑 console.error(response); }) .uploadToGoogleDrive(res); }
文件处理函数(核心修正)
function getFiles(file) { return new Promise((resolve, reject) => { if (!file) { reject("No file"); return; } const fr = new FileReader(); fr.onload = e => { let obj = {}; if(file.type.includes('video')){ // 将ArrayBuffer转成base64字符串,和文档处理逻辑统一 const uint8Array = new Uint8Array(e.target.result); const base64Str = btoa(String.fromCharCode.apply(null, uint8Array)); obj = { binary: base64Str, mimeType: file.type, fileName: file.name }; }else{ // 原文档处理逻辑保留 const data = e.target.result.split(","); obj = { binary: data[1], mimeType: data[0].match(/:(\w.+);/)[1], fileName: file.name }; } resolve(obj); } if(file.type.includes('video')){ fr.readAsArrayBuffer(file); }else{ fr.readAsDataURL(file); } }); }
移除冗余函数
原binArrayToString函数不再需要,直接删除即可,因为我们现在直接将Uint8Array转成base64字符串传输。
服务端上传函数(无需修改)
function uploadToGoogleDrive(obj){ const FOLDER_ID = ''; // 填写你的文件夹ID let blob = Utilities.newBlob(Utilities.base64Decode(obj.binary), obj.mimeType, obj.fileName); let folder = DriveApp.getFolderById(FOLDER_ID); folder.createFile(blob).getId(); }
关键修正点说明
- 错误修复:原代码中
new Uint8Array(file)是错误的,应该使用e.target.result(即FileReader读取后的ArrayBuffer)来创建Uint8Array - 统一传输格式:视频和文档都采用base64字符串传输,服务端统一用
Utilities.base64Decode解码,避免二进制信息丢失 - 简化逻辑:视频处理不再需要分片拼接字符串,直接通过
btoa将Uint8Array转成base64,代码更简洁可靠
内容的提问来源于stack exchange,提问作者Jed Santos
相关产品推荐
相关产品推荐

