小弟是一名学员,在模拟文件上传下载时遇到了不能解决的问题,希望各位高手帮忙看下!
现在是下载中的一个问题,我已经在一个action中拿到了要下载文件的name和path,在这个jsp页面中发送请求到downloadLinkAction中取得流,下面是jsp页面(只贴了有用部分):
<head>
<script type="text/javascript"> function downloadFile(fileName,filePath) {
location.href=encodeURI("download.action?fileName="+fileName+"&filePath="+filePath);
}
</script></head>
  <body>
  
       <s:iterator value="#request.fileMap">     <a href="#" onclick="downloadFile('<s:property  value="key" />','<s:property value="value" />');">
  <s:property value="key"/>
     </a><br>
    
   </s:iterator>
  </body>
下面是downloadLinkAction:
package com.sff.project.action;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;import com.sff.project.util.BaseAction;public class DownloadLinkAction extends BaseAction {
private String fileName; private String filePath;

@Override
public String execute() throws Exception {
return SUCCESS;
} public InputStream getDownloadFile(){
try{
String path = getFilePath();
File file=new File(path);
InputStream is=new FileInputStream(file);

return is;

}catch(Exception e){
e.printStackTrace();
return null;
}
}

public String getFileName() {
try {
return new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {

e.printStackTrace();
return fileName;
}

} public String getFilePath() {
try {
return new String(filePath.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return filePath;
}

} public void setFileName(String fileName) {
this.fileName = fileName;
} public void setFilePath(String filePath) {
this.filePath = filePath;
}

}
下面是struts中的配置:
<action name="download" class="com.sff.project.action.DownloadLinkAction">

<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=ISO-8859-1</param>

<param name="contentDisposition">
attachment;filename="${fileName}"
</param>
<param name="inputName">
downloadFile
</param>
<param name="bufferSize">
4096
</param>
</result>  
</action>
下面是执行Action中抛出的异常(好像是在struts内部抛出的):
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:752)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
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:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
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.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)
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:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:619)
请高手帮忙解决一下,很急,小弟在此谢过了!

解决方案 »

  1.   

    1.首先你请求的action请求的是execute方法并不是getDownloadFile方法。
    2.其次在配置文件中获取属性值不用添加引号${fileName}
    3.你是通过链接get方式请求的。你在action中应该通过request.getParameter()来获取参数值。
      
      

  2.   

    <param name="inputName">
    downloadFile
    </param>
    谢谢朋友,这里的配置就是调用getDownloadFile方法的,并且fileName和filePath都能正常拿到,也就是在返回inputstream的时候抛出的异常,看似是struts内部报的异常,不知道如何能解决
      

  3.   

    返回映射 和 方法调用 没有问题!
    但是提交确实是get,所以需要用request.getParameter()取值,所以导致你的入口方法,返回的流出现异常
      

  4.   

    不过 如果你有属性的set方法一样可以,不一定需要request.getXXX。你的问题是 路径=服务器路径+文件名
    而你的只有路径,没有拼上文件名字,你觉得能找到吗??
      

  5.   

    我的那个路径path就是完整的路径+文件名,如果找不到的话,会抛出java.io.FileNotFoundException这个异常的,这里系统已经找到了指定的文件,但是就是返回流的时候出错了!
      

  6.   

    我刚用request.getParameter()试了一下,还是一样的抛这个异常,头都大了,怎么解决啊…………
      

  7.   

    我用struts2实现文件下载的时候直接套用框架的,所以不知道你这是啥错
      

  8.   

    你先debug看下,或者把你的path打印出来给大家看下
    先确定 InputStream is=new FileInputStream(file);
    这步有没问题