springmvc 文件下载报错 getOutputStream() has already been called for this response

springmvc 文件下载报错 getOutputStream() has already been called for this response,第1张

使用struts2 进行文件下载是手茄,总报错:

java.lang.IllegalStateException: getOutputStream() has already been called for this respons

解决办法:

把对应的action的毕乎察返回设置为空,即可轻松解决。

例如:

public class DownloadFileAction extends ActionSupport implements

ServletRequestAware, ServletResponseAware {

/**

*

*/

private static final long serialVersionUID = -7448748577778248376L

private HttpServletRequest request

private HttpServletResponse response

private String savePath

@Override

public String execute() throws Exception {

String fileName=request.getParameter("fileName")

String fullPath=getSavePath()+"//"+fileName

fileName=new String(fileName.getBytes("utf-8"),"iso-8859-1")

InputStream is=new FileInputStream(fullPath)

int len=0

byte []buffers=new byte[1024]

response.reset()

response.setContentType("application/x-msdownload")

response.addHeader("Content-Disposition", "attachmentfilename=\""+fileName+"\"")

OutputStream os = null

//把文件内容通过输出流打印到页面上供下载

while((len=is.read(buffers))!=-1){

os=response.getOutputStream()

os.write(buffers, 0, len)

}

is.close()

os.flush()

//return SUCCESS//会报错:java.lang.IllegalStateException: getOutputStream() has already been called for this respons

return null//顷余ok

}

public void setServletRequest(HttpServletRequest req) {

this.request=req

}

public void setServletResponse(HttpServletResponse resp) {

this.response=resp

}

@SuppressWarnings("deprecation")

public String getSavePath() {

return request.getRealPath(savePath)

}

public void setSavePath(String savePath) {

this.savePath = savePath

}

}

spring依赖的jar包如下:

下面是每个jar包的说明

spring.jar 是包含有完整发布模块的单个jar 包。但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2.jar。

spring-src.zip就是所有的源代码压缩包。

除了spring.jar 文件,Spring 还包括有其它21 个独立的jar 包,各自包含着对应的Spring组件,用户可以根据凳亮腊自己的需要来选择组合自己的jar 包,而不必引入整个spring.jar 的所有类文件。

spring-core.jar

这个jar 文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。

外部依赖Commons Logging, (Log4J)。

spring-beans.jar

这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI) *** 作相关的所枣滑有类。如果应用只需基本键仿的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。

外部依赖spring-core,(CGLIB)。

spring-aop.jar

这个jar 文件包含在应用中使用Spring 的AOP 特性时所需的类和源码级元数据支持。使用基于AOP 的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。

外部依赖spring-core, (spring-beans,AOP Alliance, CGLIB,Commons Attributes)。

spring-context.jar

这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。

外部依赖spring-beans,

要不给你一个可以直接调用的方法吧,你也可以对比修改

/**

     * 下载文件

     * 

     * @param request

     * @param response

     * @param storeName 被下载文件路径

     * @param contentType  推荐:application/octet-stream

     * @param realName 下载时显示的文件名称

     * 返闷陵@throws Exception

     */

    public static void download(HttpServletRequest request, HttpServletResponse response, String storeName, String contentType, String realName)

            throws Exception {

        request.setCharacterEncoding("UTF-8")

        BufferedInputStream bis = null

       漏戚 BufferedOutputStream bos = null

        try {

            String downLoadPath = storeName

            long fileLength = new File(downLoadPath).length()

            response.setContentType(contentType)

            response.setHeader("Content-disposition", "attachment filename=" + new String(realName.getBytes("utf-8"), "ISO8859-1"))

            response.setHeader("Content-Length", String.valueOf(fileLength))

            bis = new BufferedInputStream(new FileInputStream(downLoadPath))

            bos = new BufferedOutputStream(response.getOutputStream())

            byte[] buff = new byte[2048]

            int bytesRead

            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {

                bos.write(buff, 0, bytesRead)

            }

        } catch (Exception e) {

            e.printStackTrace()

            throw e

       罩饥 } finally {

            if (bis != null)

                bis.close()

            if (bos != null)

                bos.close()

        }

    }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12135712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存