ビデオ ファイルをダウンロードする単純な 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)
この例外を回避する方法はありますか?
前もって感謝します。