使用NodeJS调用Google Drive API v3下载文件异常求助
问题分析与解决方案
问题根源
axios默认会将响应数据解析为UTF-8编码的字符串,而图片这类二进制文件包含大量非UTF-8兼容的字节,解析过程中会破坏原始数据结构,导致保存后的文件内容异常。
修复代码
修改下载方法
在axios请求中添加responseType: 'arraybuffer',让axios以二进制数组形式接收数据,避免编码转换损坏文件:
async downloadFile(fileId, mimeType) { await this.getToken(); return axios({ url: `https://www.googleapis.com/drive/v3/files/${fileId}`, method: "GET", headers: { authorization: `Bearer ${this.token}`, }, params: { alt: 'media', }, responseType: 'arraybuffer' // 关键配置:保留二进制数据 }) .then(response => response.data) .catch(error => { console.error(error); throw error; }); }
修正调用代码
注意变量名一致性,同时确保文件写入时正确处理二进制缓冲区:
let fileBuffer = await drive.downloadFile(driveId, mimeType); // 回调式写法 fs.writeFile('./sth.jpg', fileBuffer, (err) => { if (err) console.error('保存失败:', err); }); // 或更贴合async/await的Promise写法 await fs.promises.writeFile('./sth.jpg', fileBuffer);
原理说明
设置responseType: 'arraybuffer'后,axios会跳过字符串解析步骤,直接返回原始的二进制数据缓冲区(ArrayBuffer),写入文件时能完整保留文件的原始字节,确保下载后的图片和手动下载的内容完全一致。
内容的提问来源于stack exchange,提问作者Andor
相关产品推荐
相关产品推荐

