当前位置: 首页 > 知识库问答 >
问题:

从web服务器下载文件时发生java.lang.IllegalStateException servlet异常

东门俊民
2023-03-14
        июн 26, 2015 2:08:42 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/TestTask] threw exception
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
    at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:462)
    at org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler.handleErrorInDevMode(DefaultDispatcherErrorHandler.java:109)
    at org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler.handleError(DefaultDispatcherErrorHandler.java:57)
    at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:909)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:576)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
package actions;

import java.io.IOException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.Action;

import org.apache.log4j.Logger;
import org.apache.struts.chain.contexts.ServletActionContext;

import service.CsvCreator;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadCsvAction extends ActionSupport {

    private static final long serialVersionUID = -4714537109287679996L;
    private CsvCreator CSVcreator;
    private static final Logger logger = Logger.getLogger(DownloadCsvAction.class);

    public CsvCreator getCSVcreator() {
        return CSVcreator;
    }

    public void setCSVcreator(CsvCreator cSVcreator) {
        CSVcreator = cSVcreator;
    }

    @Override
    public String execute() {

        HttpServletResponse response = org.apache.struts2.ServletActionContext.getResponse();
        response.setHeader("Content-Disposition", "attachment; filename=\"phone_records.csv\"");
        response.setContentType("text/csv");

        ServletOutputStream out;
        try {
            out = response.getOutputStream();

            String tableHeader = "Caller, Event, Reciever, Timestamp\n";

            out.write(tableHeader.getBytes("UTF-8"));
            out.write(CSVcreator.getAllRecordsInString().getBytes("UTF-8"));
            
            out.flush();
            out.close();
        } catch (IOException e) {
            logger.error(e.getMessage());
        }

        return SUCCESS;
    }

}

和我的struts.xml:

<action name="DownloadCsvAction" class="DownloadCsvAction">
        <result name="success" type="dispatcher"/>
</action>

共有1个答案

徐奇
2023-03-14

为什么会是什么?

因为响应已经提交。在Struts2使用它之前,您已经有了关闭响应。

我怎么解决这个问题?

 类似资料:
  • 编辑 当我在模拟器中运行这段代码时,代码仍然不能工作-文件没有下载。

  • 问题内容: 我有一个URL,用于保存我的工作中的一些项目,它们大部分是MDB文件,但也有一些JPG和PDF。 我需要做的是列出该目录中的每个文件(已完成)并为用户提供下载它的选项。 使用PHP如何实现? 问题答案: 要读取目录内容,可以使用readdir()并使用脚本(在我的示例中)来下载文件 在其中,您可以强制浏览器发送下载数据,并使用basename()来确保客户端不会传递其他文件名,例如

  • 我正试图下载一些公共数据文件。我通过screensrap获取指向文件的链接,这些文件看起来都是这样的: 我在Requests library网站上找不到任何文档。

  • 我创建了一个web应用程序,它允许其用户从运行应用程序的同一服务器下载文件。然而,我不能让它按照我希望的方式工作,现在我甚至不确定这是否可能。

  • 问题内容: 嗨,我有一堆.mp3文件,我想与NSFileManager一起使用并存储在documents文件夹中。有没有一种方法可以在线下载.mp3文件,然后将其保存到documents文件夹?这就是我正在使用的本地文件。 问题答案: 编辑/更新: Xcode 11.5•Swift 5.2 原始答案 Xcode 8.3.2•Swift 3.1

  • 问题内容: 好吧,这看起来很简单,确实如此。将文件下载到服务器所需要做的就是: 只有一个问题。如果文件很大,例如100mb,该怎么办?然后,您将耗尽内存,并且无法下载文件。 我想要的是一种在下载文件时将文件写入磁盘的方法。这样,我可以下载更大的文件,而不会遇到内存问题。 问题答案: 从PHP 5.1.0开始,支持通过传递流句柄作为参数来逐段编写: 从手册中: 如果 数据 [是第二个参数]是流资源,