通过Google Drive API v3下载文件时保留真实文件名的实现方案
解决Google Drive API下载文件显示FileID而非真实文件名的问题
要让下载的文件使用真实名称,核心是先获取文件的元数据(包含真实文件名),再通过响应头告知浏览器正确的文件名,具体实现如下:
核心思路
- 调用Google Drive API的
Files.get接口,传入FileID获取文件元数据(其中name字段即为真实文件名) - 向客户端返回响应时,设置
Content-Disposition响应头,明确指定下载的文件名
修改后的代码示例
async Download(fileID, res, type='stream') { try { var Google = await CloudStorage.Initialize(); // 第一步:调用Files.get接口获取文件真实名称 const metadata = await new Promise((resolve, reject) => { https.get(Google.API.STORAGE.Files.Get(fileID), { headers: { "Authorization": "Bearer " + Google.AccessToken.token } }, (metaRes) => { let metaDataStr = ''; metaRes.on('data', chunk => metaDataStr += chunk); metaRes.on('end', () => resolve(JSON.parse(metaDataStr))); metaRes.on('error', reject); }).end(); }); const realFileName = metadata.name; // 第二步:下载文件并设置正确的响应头 https.get(Google.API.STORAGE.Files.Download(fileID), { headers: { "Authorization": "Bearer " + Google.AccessToken.token }, responseType: type }, (resApi) => { // 设置Content-Disposition头,指定下载文件名 res.writeHead(resApi.statusCode, { 'Content-Disposition': `attachment; filename="${encodeURIComponent(realFileName)}"`, 'Content-Type': resApi.headers['content-type'] || 'application/octet-stream' }); resApi.pipe(res); }).on('error', () => { res.status(500).send('文件下载失败'); }).end(); } catch (err) { res.status(500).send('获取文件信息失败'); } }
关键细节说明
Content-Disposition头的attachment值会强制浏览器触发下载行为,filename参数指定真实文件名,用encodeURIComponent处理特殊字符可避免文件名乱码- 替换原有的
text/plain为application/octet-stream(或复用Google Drive返回的Content-Type),更适配二进制安装包、可执行文件的传输场景 - 增加了错误捕获逻辑,避免API调用失败导致服务异常
内容的提问来源于stack exchange,提问作者Fuczi Fuczi
相关产品推荐
相关产品推荐

