在春季下载pdf后重定向

时间:2017-12-14 08:37:16

标签: spring jsp servlets spring-boot

我正在使用弹簧靴。我编写了将数据上传到数据库的代码。如果出现问题,数据将以PDF格式下载,这是错误的。我想要做的是,我必须下载该pdf并直接转到另一页。

@RequestMapping(value = "/doUpload", method = RequestMethod.POST)
public void doUpload(@ModelAttribute("employeeCsvForm") EmpFileUpload fileUpload,HttpServletRequest request, HttpServletResponse response){

    // codes for create pdf.

    if (errorCount != 0) { //errorCount is the count of error data  

        File fileEmp = new File("error.pdf");

        //downloading the pdf in browser path
        if (fileEmp.exists()) {
            FileUtils.copyFile(fileEmp, response.getOutputStream());
            response.setContentType("application/pdf");
            response.setHeader("Content-disposition", "attachment;filename=error.pdf");
            response.flushBuffer();             
        }   
    }
}

此代码下载pdf文件。但是我必须重定向到另一个页面,所以我使用了

response.sendRedirect(request.getContextPath() + "/employee/errorCsv"); response.flushBuffer();成功下载pdf 但显示错误

response.sendRedirect(request.getContextPath() + "/employee/errorCsv");

错误是:已为此响应调用了getOutputStream()

当我在response.flushBuffer();之前编写重定向代码1,2.2, 3.5 ,6, 7.7 时,它已成功指向其他网页但未下载

我想做两件事,我尽我所能,但失败了。提前谢谢。

1 个答案:

答案 0 :(得分:3)

在开始下载后,您无法重定向

这就是为什么每个下载时重定向的页面(例如Sourceforge)通过以下方式执行此操作:

  • 首先将您重定向到目标网页
  • 等待几秒钟(可能是可选的,但可能有助于加载目标页面)
  • 然后使用Javascript启动下载(对于浏览器,这实际上是另一个重定向)

从技术上讲,HTTP重定向是HTTP标头的一部分。标题是在任何实际内容之前通过HTTP发送的,一旦您开始发送正文(内容)就无法发送 - 这就是您收到错误的原因。

对于浏览器,下载只是一种特殊的页面访问 - 最终下载数据而不是将其显示为网站。现在,您只能在网站中启动重定向(即直接浏览器访问另一个页面),如果下载则无法执行此操作。因此,以下步骤顺序不可行:

  • 访问初始页
  • 在初始页面,直接浏览器下载文件
  • 直接浏览器访问目标页面

所以你需要做的是交换步骤:

  • 访问初始网站
  • 在初始页面,指示浏览器访问目标页面
  • 在目标页面,直接浏览器下载文件