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

如何在Node.js中通过Drive API上传从第三方系统拉取的文件?

修复步骤

核心问题说明

  • 拉取二进制文件时axios默认将响应转成UTF-8字符串,破坏了原始字节结构,导致上传后文件损坏
  • Node.js环境无需用Blob,直接用原生Buffer处理二进制数据即可
  • 上传文件内容阶段错误使用了元数据上传的application/json请求头,类型不匹配
  • 写死的Content-Length容易和实际文件大小不符,引发上传异常

修正后完整代码

// 1. 拉取第三方文件,指定响应类型为arraybuffer,直接获取Buffer格式的原始二进制数据
let res = await axios.get("第三方系统文件拉取地址", {
  headers,
  responseType: 'arraybuffer'
});
let fileToUpload = res.data; // 此时为Buffer类型,保留完整二进制结构

// 2. 构造文件元数据
let data = {
  name: 'image.png',
  parents: ['1BD50Xdf5456ghec8Ccwa5YNEkpgPaOxdE_M']
};

// 3. 上传元数据获取续传地址
let metaHead = {
  headers: {
    'Content-Type': 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + driveaccessToken
  }
};
res = await axios.post('https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable', JSON.stringify(data), metaHead);
let uploadUrl = res.headers.location;

// 4. 上传文件内容,使用对应文件类型的请求头
let contentHead = {
  headers: {
    'Content-Type': 'image/png', // 可根据实际文件类型修改,比如JPG改为image/jpeg
    'Content-Length': fileToUpload.length, // 取实际Buffer长度,无需写死
    'Authorization': 'Bearer ' + driveaccessToken
  }
};
res = await axios.put(uploadUrl, fileToUpload, contentHead);
console.log(res.status);

注意事项

  • 若上传的不是PNG图片,需将Content-Type修改为对应文件的MIME类型,也可以直接从拉取第三方文件接口的响应头content-type字段取值,无需手动指定
  • Buffer是Node.js原生内置API,无需安装额外依赖
  • axios会自动计算请求体的Content-Length,若没有特殊需求可以省略该字段,减少出错概率

内容的提问来源于stack exchange,提问作者user15381235

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:39:02