使用Google Drive API的Resumable URI上传无响应且报408错误,代码是否有问题?
Google Drive可恢复上传408错误排查与修复
问题场景
通过Google Drive API获取Resumable URI后,使用该URI执行PUT文件上传时无响应,一段时间后收到408请求超时错误:
408
这是一个错误。
您的客户端发送请求耗时过长。
我们仅了解这些信息。
Resumable URI:https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&upload_id=ADPycducJGWQ62n6E0K5mD81RGJw-0eIsga8dBxarfSY_2Pk5hFJhBs230Q8ay
原PUT请求代码:
let postFile = await axios.request( { method: "PUT", url: resumableURI, headers: { Authorization: `Bearer ${process.env.GOOGLE_ACCESS_TOKEN}`, "Content-Length": req.files.muploadedFile.size, }, body : bufferToStream(buffer) } ) console.log(postFile.data)
代码问题分析
- Axios请求体参数错误:Axios中传递请求体的字段是
data,而非body。原代码用body导致实际请求没有携带文件内容,服务器一直等待数据传输,最终返回408超时。 - 缺少Content-Type头:Google Drive API需要明确的文件类型标识,未指定
Content-Type可能导致服务器无法正确解析请求,延长处理时间甚至触发超时。 - 流的有效性验证:需确保
bufferToStream函数正确将Buffer转换为Node.js可读流,若流未正确初始化或结束,会导致服务器一直等待数据。
修正后的代码
// 先确保bufferToStream函数正确实现,示例: function bufferToStream(buffer) { const stream = require('stream').Readable(); stream.push(buffer); stream.push(null); return stream; } let postFile = await axios.request({ method: "PUT", url: resumableURI, headers: { Authorization: `Bearer ${process.env.GOOGLE_ACCESS_TOKEN}`, "Content-Length": req.files.muploadedFile.size, "Content-Type": req.files.muploadedFile.mimetype // 添加文件MIME类型 }, data: bufferToStream(buffer) // 替换body为data }); console.log(postFile.data);
额外注意事项
- 确认
process.env.GOOGLE_ACCESS_TOKEN是有效的、未过期的访问令牌。 - 若文件较大,可利用可恢复上传的分块特性,避免单次请求超时。
- 检查服务器网络环境,确保能稳定连接到Google Drive API服务器。
内容的提问来源于stack exchange,提问作者karthi keyan
相关产品推荐
相关产品推荐

