You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Web应用上传视频至Google Drive出现0字节问题求助

问题解决:Web应用向Google Drive上传视频文件0字节问题

文档上传功能正常,但视频上传后文件为0字节,核心问题在于二进制数据处理逻辑错误:

  1. 视频处理时错误地将File对象直接传入Uint8Array,而非读取后的ArrayBuffer
  2. 将二进制数据转成普通字符串传输,导致二进制信息丢失,服务端无法正确解码

以下是修正后的完整代码:

绑定按钮的事件函数

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:20:41