首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

struts2 文件动态下载有关问题

2012-06-08 
struts2 文件动态下载问题如上文件下载出现以下异常javax.servlet.ServletException: java.lang.IllegalAr

struts2 文件动态下载问题
如上文件下载出现以下异常
javax.servlet.ServletException: java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack. Check the <param name="inputName"> tag specified for this action.
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)


root cause 

java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack. Check the <param name="inputName"> tag specified for this action.
org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:189)
org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:348)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:253)


怎么会说找不到inputSteam的名字呢?<param name="inputName">downloadFile</param>
这个配置没问题啊,前两天还好好的,怎么今天下载又出现这个异常了,以下是我的代码请各位校正!!!


从数据库中查出要下载的文件名,通过URL超链接过去,传入下载的文件名参数
附件下载:&nbsp;<a href=download.action?name=<%=fname %>><%=fname1 %></a>(这些都没问题)
<%
CaseAttach caseatt =(CaseAttach) request.getAttribute("caseattach");
if(caseatt!=null)
{
String fname1 = caseatt.getName();
//System.out.println("===="+fname);
String fname = java.net.URLEncoder.encode(fname1, "UTF-8"); 
//System.out.println("===="+fname);
%>
<td>附件下载:&nbsp;<a href=download.action?name=<%=fname %>><%=fname1 %></a></td>

以下是action的处理
package com.goodstart.oa.casemanager.action;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;


public class TcaseDownloadAction extends ActionSupport{

  private static final long serialVersionUID = 6329383258366253255L;
   
//该属性是依赖注入的属性,可以在配置文件中动态指定该属性值
private String fileName;

  public void setFileName(){ 
  //得到请求下载的文件名 
  String fname=ServletActionContext.getRequest().getParameter("name");  
  try { 
  /* 
  * 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。 
  * 这里使用request.setCharacterEncoding解码无效. 
  * 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件 
  * */  
  fname = new String(fname.getBytes("ISO-8859-1"), "UTF-8"); 
 
  } catch (Exception e) { 
  e.printStackTrace(); 
  }  
  this.fileName=fname;  
  System.out.println("set------"+this.fileName); 这里打印都可以得到正确的文件名 
  } 

 
  /* 
  * @getFileName 
  * 此方法对应的是struts.xml文件中的: 
  * <param name="contentDisposition">attachment;filename="${fileName}"</param> 
  * 这个属性设置的是下载工具下载文件时显示的文件名, 
  * 要想正确的显示中文文件名,我们需要对fileName再次编码 
  * 否则中文名文件将出现乱码,或无法下载的情况 
  * */ 
  public String getFileName() throws UnsupportedEncodingException { 
   
  fileName=new String(fileName.getBytes(),"ISO-8859-1");  
   
 
  return fileName; 


  } 

  /* 
  * @getDownloadFile 
  * 此方法对应的是struts.xml文件中的: 
  * <param name="inputName">downloadFile</param> 
  * 返回下载文件的流,可以参看struts2的源码 
  * */ 
  public InputStream getDownloadFile() { 
  System.out.println("downLoad");
  this.setFileName();
  System.out.println("*****"+this.fileName); 这里打印都可以得到正确的文件名 

  return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName); 
  } 


//处理用户请求的execute方法,该方法返回success字符串
public String execute() throws Exception
{

return SUCCESS;
}

}

以下是struts.xml配置参数
<package name="down" extends="struts-default">
<!-- 配置下载的拦截器引用
<default-action-ref name="download" />
-->
<action name="download"
class="com.goodstart.oa.casemanager.action.TcaseDownloadAction">
<!-- 指定被下载资源的位置 -->

<!-- 配置结果类型为stream的结果 -->
<result name="success" type="stream">
<!-- 指定下载文件的文件类型 -->

<!-- 指定下载文件的位置 -->
<param name="contentDisposition">filename=${fileName}</param>
<param name="inputName">downloadFile</param>

<!-- 指定下载资源的缓冲大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
</package>

[解决办法]
路过……up
[解决办法]
lz顶!
[解决办法]
你的action里没有定义downloadFile这么一个InputStream类型的变量吧?
定义一个试试
[解决办法]

探讨
你的action里没有定义downloadFile这么一个InputStream类型的变量吧?
定义一个试试

[解决办法]
我也遇到过这样的问题,本来是好的,今天再去看,却发现出现和楼主一样的错误。
不知道楼主解决了没有啊。如果解决了,请告诉我一下是怎么解决的。谢谢。
[解决办法]
恭喜 难道action中不需要一个InputStream变量?

热点排行