解决Google Drive API可恢复上传中Content-Range Header解析错误
核心问题排查与修复步骤
修正Axios请求参数格式
你的代码错误地将Buffer数据包裹在{body: data}对象中作为PUT请求的第二个参数,这会让Axios自动把该对象序列化为JSON格式,导致实际发送的请求体并非原始二进制Buffer,进而造成Content-Length与实际内容长度不匹配,触发Content-Range解析错误。修正后的代码:
const new_access_token = await refreshAccessToken(); const res = await axios.put(resumable_url, data, { headers: { "Authorization": `Bearer ${new_access_token}`, "Content-Range": `bytes 0-255999/2000000` } }); console.log(res);移除手动设置的Content-Length
Axios会自动根据传入的Buffer长度计算并设置Content-Length头,手动设置的值如果与实际Buffer长度不符,会直接导致Google Drive API无法解析Content-Range。建议删除代码中手动设置的"Content-Length": 256000。验证Buffer分片长度
在发送请求前,检查data的实际长度是否为256000字节:console.log(data.length); // 确认输出为256000如果长度不符,调整分片切割逻辑,保证分片长度与Content-Range中声明的
0-255999(共256000字节)完全一致。确认总文件大小一致性
Content-Range中的总大小2000000必须与创建可恢复会话时指定的文件总大小完全一致。如果创建会话时未正确设置总大小,也会引发解析错误。检查Content-Range格式
确保Content-Range头的格式严格符合标准:bytes start-end/total,其中start是分片起始字节(从0开始),end是分片结束字节(start + 分片长度 - 1),total是文件总字节数。避免出现多余空格、换行或特殊字符。
后续分片上传注意事项
- 下一个分片的Content-Range应从当前分片的结束字节+1开始,比如第一个分片结束于255999,第二个分片的Content-Range应为
bytes 256000-511999/2000000。 - 最后一个分片的结束字节必须等于文件总字节数-1,比如总大小2000000,最后一个分片的结束字节是1999999。
内容的提问来源于stack exchange,提问作者Aman Vishnoi

