如何用Axios获取S3存储文件?代码问题及MIME类型获取求助
解决方案:生成可正常打开的文件(优先Axios实现)
一、Axios 修复方案
你的原Axios代码无法生成有效文件,核心问题是没有指定响应类型——Axios默认会把响应数据解析为文本或JSON,而非原始二进制数据,导致生成的File内容损坏。
修复后的代码如下:
export async function urlToFile(url: string, fileName: string): Promise<File> { const response = await axios.get(url, { responseType: 'arraybuffer' // 关键:让Axios返回原始二进制数组 }); // 从响应头自动获取MIME类型,兜底用通用二进制类型 const mimeType = response.headers['content-type'] || 'application/octet-stream'; return new File([response.data], fileName, { type: mimeType }); }
关键说明:
responseType: 'arraybuffer':强制Axios返回原始二进制数据,避免解析错误- 从
response.headers['content-type']获取S3返回的文件类型(比如PDF的application/pdf),确保File对象被浏览器正确识别
二、Fetch 方案优化(自动获取MIME类型)
如果用Fetch方案,也可以去掉手动传入MIME类型的限制,直接从响应头读取:
export function urltoFile(url, filename) { if (url.startsWith('data:')) { const arr = url.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[arr.length - 1]), n = bstr.length, u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); } const file = new File([u8arr], filename, {type: mime}); return Promise.resolve(file); } return fetch(url) .then(res => { // 自动从响应头获取MIME类型 const mimeType = res.headers.get('Content-Type') || 'application/octet-stream'; return res.arrayBuffer().then(buf => new File([buf], filename, {type: mimeType})); }); }
说明:
- 对于dataURL格式的链接,直接从URL中提取MIME类型
- 对于普通下载链接,通过
res.headers.get('Content-Type')获取S3返回的文件类型,无需手动指定
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

