当前位置: 代码迷 >> J2EE >> struts2 文件动态下载有关问题
  详细解决方案

struts2 文件动态下载有关问题

热度:78   发布时间:2016-04-22 01:19:05.0
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; 
  相关解决方案