SpringBoot项目中文件下载功能reponse.getOutputStream()重复调用问题解决

SpringBoot项目中文件下载功能reponse.getOutputStream()重复调用问题解决

报错信息


java.lang.IllegalStateException: getOutputStream() has already been called for this response
	at org.apache.catalina.connector.Response.getWriter(Response.java:636)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
	at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:104)
	at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
	at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
	at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:186)
	at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:126)
	at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
	at org.apache.jsp.WEB_002dINF.views.manager.disk.main_jsp._jspService(main_jsp.java:166)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604)
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543)

报错信息只截取一部分

查看其他博客有的通过在方法上添加@ResponesBody注解,有的是调用getOutputStream()之前reset,亲测不太行

下面来看

解决方案后写法

public ModelAndView download(HttpServletResponse response) {
        try {
            // path是指欲下载的文件的路径。dataTemplatePath是在配置文件中定义的 通过@Value注入的
            File file = new File(System.getProperty("user.dir")+dataTemplatePath);
            // 取得文件名。
            String filename = file.getName();
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(file));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return null;
    }

开始我的返回值是HttpServletResponse 返回的是这个respones对象,各种测试,都不行,直到我把返回值改成ModelAndView返回值为null时就可以了

记录一下,有相似错误的朋友可以试试这个方法
祝您们代码永无BUG,服务器永不宕机!!!

猜你喜欢

转载自blog.csdn.net/weixin_45793355/article/details/108243637