如上文件下载出现以下异常
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超链接过去,传入下载的文件名参数
附件下载: <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>附件下载: <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;