You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js调用Spring Boot接口无法下载Jaspersoft生成的PDF

解决React调用Spring Boot接口无法下载PDF的问题

这种情况我之前也碰到过,核心问题在于React的HTTP请求库(比如axios/fetch)默认不会自动处理二进制文件的下载响应,而浏览器直接访问时会自动识别Content-Disposition头并触发下载。下面分步骤给你解决方法:

1. 先确认Spring Boot接口的响应头配置

首先要确保你的Spring Boot接口已经正确设置了响应头,保证返回的是PDF类型且包含下载提示:

@GetMapping("/export-pdf")
public ResponseEntity<byte[]> exportPdf() {
    // 生成PDF字节数组的业务逻辑
    byte[] pdfBytes = jasperReportService.generatePdfContent();
    
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_PDF);
    // 配置下载文件名,会作为浏览器下载时的默认文件名
    headers.setContentDispositionFormData("attachment", "report.pdf");
    headers.setContentLength(pdfBytes.length);
    
    return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK);
}

如果接口已经按上述配置,那问题就出在React的请求处理环节。

2. React端的请求处理(分两种常用库)

方法一:使用Axios

如果你的项目用Axios,必须配置responseType: 'blob',然后手动创建下载链接触发下载:

import axios from 'axios';

const downloadReportPdf = async () => {
  try {
    const response = await axios.get('/api/export-pdf', {
      responseType: 'blob', // 关键:指定响应为二进制流类型
      headers: {
        // 如果接口需要认证,这里带上你的token
        'Authorization': `Bearer ${localStorage.getItem('authToken')}`
      }
    });

    // 将响应数据转为Blob对象,生成临时下载链接
    const blob = new Blob([response.data], { type: 'application/pdf' });
    const downloadUrl = window.URL.createObjectURL(blob);
    const link = document.createElement('a');
    
    link.href = downloadUrl;
    link.setAttribute('download', 'report.pdf'); // 匹配后端设置的文件名
    document.body.appendChild(link);
    link.click();
    
    // 下载完成后清理临时资源
    document.body.removeChild(link);
    window.URL.revokeObjectURL(downloadUrl);
  } catch (error) {
    console.error('PDF下载失败:', error);
  }
};

方法二:使用原生Fetch

如果用原生Fetch,同样需要将响应转为Blob,再手动触发下载:

const downloadReportPdf = async () => {
  try {
    const response = await fetch('/api/export-pdf', {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${localStorage.getItem('authToken')}`
      }
    });

    if (!response.ok) {
      throw new Error('请求接口失败');
    }

    const blob = await response.blob();
    const downloadUrl = window.URL.createObjectURL(blob);
    const link = document.createElement('a');
    
    link.href = downloadUrl;
    link.setAttribute('download', 'report.pdf');
    document.body.appendChild(link);
    link.click();
    
    // 清理临时资源
    document.body.removeChild(link);
    window.URL.revokeObjectURL(downloadUrl);
  } catch (error) {
    console.error('PDF下载失败:', error);
  }
};

3. 常见排查点

  • 确认React请求的URL和浏览器直接访问的完全一致,检查开发环境的代理配置是否正确(避免跨域或路径错误)
  • 打开浏览器控制台的Network面板,查看请求的响应状态码是否为200,响应头里是否包含Content-Disposition: attachment; filename="report.pdf"和Content-Type: application/pdf
  • 如果接口需要认证,确保React请求携带的token和浏览器访问时的认证信息一致

内容的提问来源于stack exchange,提问作者Md. Nasir Uddin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:29:20