好久好久以前的随笔:http://www.javashuo.com/article/p-epopwwgs-hy.htmlhtml
一、Struts2.5.6版本文件下载问题Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack,错误大概以下所示。java
1 message:'Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack. Check the tag specified for this action.', stackTrace:'java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack. Check the tag specified for this action.\n\tat org.apache.struts2.result.StreamResult.doExecute(StreamResult.java:231)\n\tat
这里,列一下本身遇到的坑,因为框架如今使用的较少了,就不给出完整案例,只是列一下解决思路,节省一下时间。linux
二、出现这种错误通常有下面几种可能,由于这个Struts框架报这个错误,太模棱两可了,若是找不到思路,真的很头疼。apache
1)、第一种、文件路径不对,根本就没有取到文件,这种状况下,能够将得到InputStream的那条语句放在system.out.println()中输出一下,若为null,那就是路径不对了,或者说得准确些,就是根本没有找到文件,若是是这种状况,那么就根据读取不到文件,才返回报错的。浏览器
2)、第二种、在action中没有写对应于,配置文件struts.xml中“ <param name="inputName"> ”后面属性的get方法,如本例就应该写public InputStream getDownloadFile()方法,就是下面的这个标签。说白了,就是你的语法有错误,仔细检查语法,若是是本地正常,生产环境异常,说明语法没问题,就考虑其余方向就好了。tomcat
1 <!-- 下载操做 --> 2 <result name="download" type="stream"> 3 <!-- 容许下载的文件的类型:指定为全部的二进制的文件类型,去tomcat的wen.xml里面搜索.exe --> 4 <param name="contentType">application/octet-stream</param> 5 <!-- 对应的就是Action种的属性,返回流的属性,【其实就是getAttrInputStream()】 --> 6 <param name="inputName">attrInputStream</param> 7 <!-- 下载头,包括:浏览器显示的文件名 --> 8 <param name="contentDisposition">attachment;filename="${downFileName}"</param> 9 <!-- 缓冲区大小设置 --> 10 <param name="bufferSize">1024</param> 11 </result>
3)、第三种,就是第一种状况的变形,说到底仍是找不到问题,为啥找不到问题呢,好比window操做系统,struts能够下载文件,可是linux操做系统,不能下载文件,这种状况,有的人可能会排查是否是相对路径,绝对路径的问题,固然,也有这种可能,可是若是本地测试没有问题,通常不会是这种状况,那是啥子状况呢。那就是文件名称乱码问题,说到底就是字符集问题。若是设置的是<param name="contentType">application/octet-stream;charset=ISO8859-1</param>,若是文件和文件名称是utf-8格式的,那通常就很坑爹了,这样就会形成乱码,天然就找不到文件,就报错了。app
总结:千万不要用没有优点的框架了,若是选择Struts和SpringMVC,为何不用SpringMVC呢!框架