使用Laravel和React从服务器下载PDF文件,文件内容为空
解决Axios下载PDF文件为空的问题
- 核心问题:Axios默认会将响应数据解析为JSON格式,导致二进制PDF数据被错误转换为字符串,生成的Blob自然没有有效内容。
- 修复步骤:
- 在Axios请求配置中添加
responseType: 'blob',明确告诉Axios直接返回二进制Blob数据 - 无需手动调用
JSON.stringify(),直接传入JS对象即可,Axios会自动完成JSON序列化 - 若后端对请求头有严格要求,可保留
'Content-Type': 'application/json',Axios在传入对象参数时也会自动设置该头
- 在Axios请求配置中添加
修改后的代码:
await axios.post(URL, { filter }, { headers: { Authorization: token, 'Content-Type': 'application/json' }, withCredentials: true, responseType: 'blob' // 关键配置,处理二进制响应 }).then((response) => { const url = window.URL.createObjectURL(response.data); // 直接使用已处理好的Blob数据 const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'expense.pdf'); document.body.appendChild(link); link.click(); // 清理临时URL对象,避免内存泄漏 window.URL.revokeObjectURL(url); document.body.removeChild(link); });
额外提示:
- 如果后端返回的是ArrayBuffer类型,可将
responseType设为'arraybuffer',再通过new Blob([response.data])转换为Blob使用 - 务必清理创建的临时URL对象和DOM元素,防止内存占用
内容的提问来源于stack exchange,提问作者salman
相关产品推荐
相关产品推荐

