大家好,struts2下载时老报这个异常,哪位高手帮我解决一下啊
    
    DownloadAction.java

  
    public String download()throws Exception{
return SUCCESS;
}

public InputStream getInputStream() {
this.setFilename(); 
return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+filename);
}   struts.xml
   
   <action name="download" class="download" method="download">
    <result name="success" type="stream">
  <param name="contentDisposition">attachment;filename="${filename}"</param>
  <param name="inputName">inputStream</param>
    </result>
  </action>

解决方案 »

  1.   


     不好意思, 异常是这样的  java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Check the <param name="inputName"> tag specified for this action.
    at org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:189)
    at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:348)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:253)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
      

  2.   

    package example; import java.io.ByteArrayInputStream; import java.io.InputStream; import com.opensymphony.xwork2.Action; public class FileDownloadAction implements Action { public InputStream getInputStream() throws Exception { return new ByteArrayInputStream("Struts 2 下载示例".getBytes()); } public String execute() throws Exception { return SUCCESS; } } 注意这里唯一特殊的方法就是getInputStream(),在这个方法里面我们使用了一个数组输入流来从字符串转换成的数组作为数据的来源进行读取。也许方法体中使用这样的实现代码: return new java.io.FileInputStream(“c:\\test.txt”);//从系统磁盘文件读取数据 这样会更直观一些。 文件下载的第二步,乃是在struts.xml中对action进行配置,其代码清单如下所示: <!-- 简单文件下载 --> <action name="download" class="example.FileDownloadAction"> <result name="success" type="stream"> <param name="contentType">text/plain</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="struts2.txt"</param> <param name="bufferSize">4096</param> </result> </action> 
    这个action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream。下面则列出了和下载有关的一些参数列表:
      

  3.   

    参数说明 
    contentType 
    内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片 inputName 
    下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法 contentDisposition 
    文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为: 
    attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="struts2.txt" bufferSize 
    下载缓冲区的大小 在这里面,contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Contentdisposition头。
      

  4.   

    http://blog.csdn.net/myeclipse_java/archive/2008/03/03/2143986.aspx
    我以前也碰到过这种情况,希望能对楼主有帮助
      

  5.   

    出现这个情况请先检查
    ServletActionContext.getServletContext().getResourceAsStream("/upload/"+filename); 
    返回的InputStream 对象是否为null
    如果为null说明文件的相对路径下没有找到该文件