Struts 2.0从服务器下载文件

2023-12-26

我已经创建了下载方法来从服务器端下载文件到客户端,但是出现了此错误,文件已成功下载到客户端,但我有此错误,所以我无法正确返回到上一页。

这是我的错误:

SEVERE: Servlet.service() for servlet default threw exception
java.lang.RuntimeException: org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at com.opensymphony.sitemesh.webapp.decorator.BaseWebAppDecorator.render(BaseWebAppDecorator.java:39)
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:84)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter.doFilter(StrutsPrepareFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at gnv.carnaval.webapp.filter.LocaleFilter.doFilterInternal(LocaleFilter.java:67)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:745)

这是我的下载方法:

private void downloadReceipt(String path, HttpServletResponse response) throws IOException {
        File file = new File(path);
        FileInputStream fileIn = new FileInputStream(file);
        response.reset();
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
        ServletOutputStream out = response.getOutputStream();

        byte[] outputByte = new byte[4096];
        //copy binary contect to output stream
        while(fileIn.read(outputByte, 0, 4096) != -1)
        {
            out.write(outputByte, 0, 4096);
        }

        fileIn.close();
        out.flush();
        out.close();
    }

我该如何解决这个问题?


你正在重新发明轮子(平方)。抛出异常是因为您向 OutputStream 写入两次(一次手动,然后由框架执行另一次写入)。

要在 Struts2 中下载文件,您应该使用Stream result 如此处所述 https://stackoverflow.com/a/16935198/1654265,最终指向一个新窗口/选项卡,如此处所述 https://stackoverflow.com/a/16900840/1654265.

在某些情况下,您可能仍然希望手动写入 OutputStream,像这个 https://stackoverflow.com/a/16654313/1654265,但在那些edge情况下,您需要返回Action.NONE(这将阻止框架写入 OutputStream)以避免出现您现在遇到的异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Struts 2.0从服务器下载文件 的相关文章

随机推荐

  • 通过 MVC 和 RAZOR 编写 JSON

    我有一个 ASP NET MVC 4 应用程序 这个应用程序有一个视图 页脚中有一个 JavaScript 块 我正在使用 RAZOR 视图引擎 我正在尝试弄清楚如何将结果集转换为 JSON 数组 目前 我正在执行以下操作
  • 在 Ubuntu 中安装 npm 包时出错 [重复]

    这个问题在这里已经有答案了 我有一个项目 以前工作正常 突然开始显示此错误 这是一个使用create react app创建的react项目 同样的错误npm install and npm f install sudipt sudo De
  • 想要通过在 swift 中使用滑动手势在选项卡栏之间导航

    我想使用滑动手势在选项卡栏控制器之间导航 同时保留默认选项卡栏 我使用了这段代码 但显示错误 import UIKit class FirstViewController UIViewController override func vie
  • 模拟指标有什么影响?

    使用 xib 文件时 更改模拟指标会对您的代码 应用程序产生什么影响 或者它只是为了您的利益而作为预览工具 实际上 更改模拟指标确实会以一种非常隐蔽的方式影响您的应用程序 我发现在使用 SwipeView 库时 我的幻灯片都受到更改模拟指标
  • Ubuntu 上的 Haskell (GHC) 中的线程延迟问题

    我注意到我的一些机器上 GHC Conc 中的 threadDelay 函数有奇怪的行为 以下程序 main do print start threadDelay 1000 1000 print done 正如预期的那样 运行需要 1 秒
  • 使用BackgroundWorker处理多个操作

    我在 winform 上有一个 DataGridView 我在表单的加载方法中动态添加 DatagridViewButtonColumn 按钮名称为 btnAction 文本显示为 Process 因此 网格中的每一行的最后一列都会有此 处
  • 使用导航视图菜单项上的选择器添加自定义形状波纹

    我想添加带有圆角矩形的波纹效果以及导航视图项目的选择器 但它不断添加灰色矩形波纹效果 导航视图
  • Chrome 的“跨源读取阻止 (CORB) 阻止了跨源响应”离子

    我正在尝试对用户进行身份验证 但由于以下原因我无法调用 Api跨源读取阻止 CORB 被阻止问题我的login ts代码是 if this plugins isOnline if this wait true return else if
  • 如何在c#中找到驱动器的空闲百分比

    如何在c 中找到驱动器的百分比 例如 如果 c 为 100 GB 并且已用空间为 25 GB 则可用百分比应为 75 Use the DriveInfo class http msdn microsoft com en us library
  • Facebook Webforms 应用程序获取 app_data 查询字符串

    如何从 Facebook Webforms 应用程序获取 app data 查询字符串 我希望能够在查询字符串中发送一些信息 以便我可以在我的应用程序上显示不同的主屏幕 该应用程序位于页面选项卡中 例子 如何从 app data 获取 Pa
  • 显示图像并转换为灰度 - OpenCV for Android、Java API

    我正在 Eclipse 中编写一个 Android 应用程序 它使用OpenCV4Android http code opencv org projects opencv wiki OpenCV4AndroidAPI 我怎样才能显示一个Ma
  • 从 C++ 本机插件更新 Vector3 数组

    Marshal Copy 方法仅支持少数数组类型 现在我只知道如何复制IntPtr 从 C 代码指向浮点数组 float IntPtr pvertices GetVerticesFromCPP float vertices new floa
  • 使用 linq 删除代码时出现错误

    我遇到有关使用组合框删除数据的问题 该错误提示我不知道如何解决 任何人都可以帮助我吗 private void btnDel Click object sender EventArgs e using testEntities Setupc
  • ByVal 与 ByRef VBA

    我尝试过 JaredPar 回答的问题ByRef 与 ByVal 说明 https stackoverflow com questions 4383167 byref vs byval clarification ByVal在 VB NET
  • ant 构建文件设置 javac 位置

    我正在编辑一个旧项目的构建文件 当我向使用 Java 1 6 的项目添加一些 jar 文件时 它不会构建 它说 javac javac invalid target release 1 6 很明显 我需要告诉 ant 构建文件使用 java
  • 在 C++0x 中专门化 lambda 模板

    我编写了一个特征类 它可以让我提取有关 C 0x 中函数或函数对象的参数和类型的信息 使用 gcc 4 5 0 进行测试 一般情况处理函数对象 template
  • linux下可以分配大容量的虚拟内存吗?

    对于某些目的来说 分配大量的虚拟空间并仅在访问的页面中进行分页会很有效 分配大量内存是瞬时的 并且不会实际抓取页面 char p new char 1024 1024 1024 256 好吧 上面指出的是错误的 因为它是一个 32 位数字
  • Python 评估错误

    x 5 print eval x 1 builtins None 出现错误 TypeError NoneType object is not subscriptable 为什么我会出现上述错误 另外 如何为 eval 函数指定几个内置方法
  • Ruby、Mac、Geektool 问题,文件访问权限?

    我有一个内置的 Ruby 脚本TextMate http en wikipedia org wiki TextMate并可以在TextMate中成功运行 我还可以直接从终端成功运行此脚本 该脚本中有这样一段代码 Get the XML fi
  • Struts 2.0从服务器下载文件

    我已经创建了下载方法来从服务器端下载文件到客户端 但是出现了此错误 文件已成功下载到客户端 但我有此错误 所以我无法正确返回到上一页 这是我的错误 SEVERE Servlet service for servlet default thr