如何在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
相关产品推荐
相关产品推荐

