很久很久之前的随笔:https://www.cnblogs.com/biehongli/p/6509557.html
1、Struts2.5.6版本文件下载问题Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack,错误大概如下所示。
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. at org.apache.struts2.result.StreamResult.doExecute(StreamResult.java:231) at
这里,列一下自己遇到的坑,由于框架现在使用的较少了,就不给出完整案例,只是列一下解决思路,节省一下时间。
2、出现这种错误一般有下面几种可能,因为这个Struts框架报这个错误,太模棱两可了,如果找不到思路,真的很头疼。
1)、第一种、文件路径不对,根本就没有取到文件,这种情况下,可以将获得InputStream的那条语句放在system.out.println()中输出一下,若为null,那就是路径不对了,或者说得准确些,就是根本没有找到文件,如果是这种情况,那么就根据读取不到文件,才返回报错的。
2)、第二种、在action中没有写对应于,配置文件struts.xml中“ <param name="inputName"> ”后面属性的get方法,如本例就应该写public InputStream getDownloadFile()方法,就是下面的这个标签。说白了,就是你的语法有错误,仔细检查语法,如果是本地正常,生产环境异常,说明语法没问题,就考虑其他方向就行了。
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格式的,那一般就很坑爹了,这样就会造成乱码,自然就找不到文件,就报错了。
总结:千万不要用没有优势的框架了,如果选择Struts和SpringMVC,为什么不用SpringMVC呢!