0

ビデオ ファイルをダウンロードする単純な Struts2 クラスをコーディングしようとしています。a がスローされるため、ダウンロード ダイアログでダウンロードをキャンセルすることを選択した場合を除き、問題java.lang.IllegalStateExceptionなく動作します (ページは正しく動作し、例外がログに記録されます)。

クラスは次のとおりです。

public class FileDownloaderAction extends ActionSupport {

/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;

/** The relative route to the file to download. */
private String relRoute;

/** The name of the file to download. */
private String fileName;

/** The InputStream to be downloaded. */
private InputStream fileStreamToDownload;

/** The size of the file to download. */
private long fileSize;

@Override
public final String execute() throws Exception {
    MyUtils mu = new MyUtils();

    try {
        File file = mu.getFile(relRoute + fileName);

        if (file != null) {
            fileStreamToDownload = new FileInputStream(file);
            fileSize = file.length();

            return Action.SUCCESS;
        } else {
            return Action.ERROR;
        }
    } catch (Exception ex) {
        return Action.ERROR;
    }
}

/** Sets the content disposition.
 * @return the content disposition.
 */
public final String getContentDisposition() {
    return "attachment;filename=\"" + fileName + "\"";
}

/**
 * @return the relRoute
 */
public final String getRelRoute() {
    return relRoute;
}

/**
 * @param mRelRoute the relRoute to set
 */
public final void setRelRoute(final String mRelRoute) {
    this.relRoute = mRelRoute;
}

/**
 * @return the fileStreamToDownload
 */
public final InputStream getFileStreamToDownload() {
    return fileStreamToDownload;
}

/**
 * @param mFileStreamToDownload the fileStreamToDownload to set
 */
public final void setFileStreamToDownload(final InputStream mFileStreamToDownload) {
    this.fileStreamToDownload = mFileStreamToDownload;
}

/**
 * @return the fileName
 */
public final String getFileName() {
    return fileName;
}

/**
 * @param mFileName the fileName to set
 */
public final void setFileName(final String mFileName) {
    this.fileName = mFileName;
}

/**
 * @return the fileSize
 */
public final long getFileSize() {
    return fileSize;
}

/**
 * @param mFileSize the fileSize to set
 */
public final void setFileSize(final long mFileSize) {
    this.fileSize = mFileSize;
}

}

一方、struts.xmlファイルで定義されたアクション:

<action name="downloadFile" class="org.test.action.FileDownloaderAction" method="execute">
    <result name="success" type="stream">
        <param name="contentType">application/octet-stream</param>
        <param name="inputName">fileStreamToDownload</param>
        <param name="contentDisposition">${contentDisposition}</param>
        <param name="contentLength">${fileSize}</param>
        <param name="bufferSize">4096</param>
        <param name="allowCaching">true</param>
        <param name="contentCharSet">UTF-8</param>
    </result>
    <result name="error">/error.jsp</result>
</action>

このコードは、私が見つけたいくつかの例に基づいています。例外がスローされると、Tomcat はこれを出力します。

abr 28, 2013 12:11:59 AM org.apache.catalina.core.StandardWrapperValve
invoke SEVERE: Servlet.service() para servlet default lanzó excepción java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:867)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:569)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
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:859)
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:722)

この例外を回避する方法はありますか?

前もって感謝します。

4

1 に答える 1

0

ファイル(あなたの場合はビデオ)データを応答に書き込むと、ブラウザから保存/キャンセルダイアログが表示されます。ブラウザはこれがファイルであることを検出し、ファイル保存ダイアログ ボックスをユーザーに提供します。ユーザーがキャンセルを選択すると、ブラウザーからサーバーへの接続がキャンセルされるため、サーバーが残りのファイルを応答に書き込もうとすると、この例外がログに記録されます。この振る舞いは有効だと思います。キャンセル アクションは完全にクライアント側 (ブラウザ内) で行われるため、サーバーからできることは何もありません。

于 2013-04-28T08:41:47.803 に答える