今天在用struts2就行文件下载时出现如下错误:

  1. Servlet.service() for servlet default threw exception
  2. java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [imageStream] in the invocation stack.
    Check the <param name="inputName"> tag specified for this action.
  3. at org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:189)
  4. at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
  5. at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:348)
  6. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:253)
  7. at com.best.top.validate.TopInterceptor.intercept(TopInterceptor.java:47)
  8. at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
  9. at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
  10. at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
  11. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
  12. at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
  13. at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
  14. at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)

说实话这个提示真有误导人的嫌疑,刚开始还以为是名称不对,估计一般人看到这个提示都这样想。然后查看StreamResult的源代码才发现是因为InputStream为null的缘故,汗一个。看下源码:

  1. if (inputStream == null) {
  2. // Find the inputstream from the invocation variable stack
  3. inputStream = (InputStream) invocation.getStack().findValue(conditionalParse(inputName, invocation));
  4. }
  5.  
  6. if (inputStream == null) {
  7. String msg = ("Can not find a java.io.InputStream with the name [" + inputName + "] in the invocation stack. " +
  8. "Check the <param name=\"inputName\"> tag specified for this action.");
  9. LOG.error(msg);
  10. throw new IllegalArgumentException(msg);
  11. }

大家如果也碰到此类问题,直接打印

  1. InputStream in=ServletActionContext.getServletContext().getResourceAsStream(realPath);
  2. System.out.println(in);

如果打印为NULL的话,恭喜您,问题得以解决,问题的原因是这个流的realPath路径错误,还没明白的往下看,怪呀,我的配置应该没错呀

页面上:

  1. <a href="fileDownload.action?fileName=<s:property value ="imageName" />">下载此图片</a>

struts.xml中:

  1. <!-- 文件下载,支持中文附件名 -->
  2. <action name="fileDownload"
  3. class="com.test.action.filedown.FileDownloadAction">
  4. <result name="success" type="stream">
  5. <!-- 动态文件下载的,事先并不知道未来的文件类型,那么我们可以把它的值设置成为:application/octet-stream;charset=ISO8859-1 ,注意一定要加入charset,否则某些时候会导致下载的文件出错; -->
  6. <param name="contentType">
  7. application/octet-stream;charset=ISO8859-1
  8. </param>
  9. <param name="contentDisposition">
  10. attachment;filename="${downloadFileName}"
  11. </param>
  12. <!-- 使用经过转码的文件名作为下载文件名,downloadFileName属性
  13. 对应action类中的方法 getDownloadFileName() 其中特殊的代码就是${downloadFileName},它的效果相当于运行的时候将action对象的属性的取值动态的填充在${}中间的部分,我们可以认为它等价于+action. getDownloadFileName()。 -->
  14. <param name="inputName">inputStream</param>
  15. <param name="bufferSize">4096</param>
  16. </result>
  17. </action>

action中:

  1. private String fileName;// 初始的通过param指定的文件名属性 set get
  2.  
  3. /** 文件名 转换编码 防止中文乱码*/
  4. public String getDownloadFileName() {
  5. String fileName=ServletActionContext.getRequest().getParameter("fileName");
  6. String downFileName = fileName;
  7. try {
  8. downFileName = new String(downFileName.getBytes(), "ISO8859-1");
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }
  12. return downFileName;
  13. }
  14. //下载的流
  15. public InputStream getInputStream() {
  16. String name=this.getDownloadFileName();
  17. // String realPath=ServletActionContext.getServletContext().getRealPath("/uploadImages")+ "/"+name; 路径错误
  18. String realPath="/uploadImages/"+name;
  19. InputStream in=ServletActionContext.getServletContext().getResourceAsStream(realPath);
  20. if(null==in){
  21. System.out.println("Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Check the <param name=\"inputName\"> tag specified for this action.检查action中文件下载路径是否正确.");
  22. }
  23. return ServletActionContext.getServletContext().getResourceAsStream(realPath);
  24. }
  25.  
  26. @Override
  27. public String execute() throws Exception {
  28. return SUCCESS;
  29. }

struts2文件下载出现Can not find a java.io.InputStream with the name的错误的更多相关文章

  1. struts2文件下载 出现Can not find a java.io.InputStream with the name的错误

    成功代码: 前台界面jsp: <a style="text-decoration:none;" href="<%=path %>/main/frontN ...

  2. Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack.

    1.错误描写叙述 八月 14, 2015 4:22:45 下午 com.opensymphony.xwork2.util.logging.jdk.JdkLogger error 严重: Excepti ...

  3. java.io.StreamCorruptedException: invalid type code: AC错误的解决方法

    问题描述: 在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流 ...

  4. 【java】io流之字节输入流:java.io.InputStream类及子类java.io.FileInputStream

    package 文件操作; import java.io.File; import java.io.FileInputStream; import java.io.IOException; impor ...

  5. Error: Default interface methods are only supported starting with Android N (--min-api 24): java.io.InputStream org.apache.poi.sl.usermodel.ObjectShape.readObjectData()

    项目运行的时候,如果报错 Error: Default interface methods are only supported starting with Android N (--min-api ...

  6. 关于Java IO InputStream 的一点整理!

    程序的开发其中一直在用文件的读写.可是对于java其中输入流以及输出流仅仅是会用不理解,一直以来想搞清楚其,可是一直没有运行(悲剧).今天早上抽出半个小时通过JDK API1.6.0中文版帮助逐步的了 ...

  7. java io InputStream 转 byte

    InputStream is ; ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] b = new byte[1024] ...

  8. Struts2文件下载

    1). Struts2 中使用 type="stream" 的 result 进行下载 2). 可以为 stream 的 result 设定如下参数 contentType: 结果 ...

  9. Struts2 文件下载

    使用Struts2做一个简单的文件下载. 首先,导包,写配置文件就不说了. 进入主题. 文件下载操作类:FileDownload.java import java.io.InputStream; im ...

随机推荐

  1. Cygwin下安装vim后,vim中退格键无法正常使用

    问题描述: 在Cygwin中安装完vim后 进入vim,发现上下左右键和退格键都无法正常使用 问题分析: 首先考虑到的就是缺少vim的配置文件,首先查看/etc路径下是否有vim的配置文件 admin ...

  2. ASIC 前端功能验证等级与对应年薪划分[个人意见] (2011-07-04 15:33:35

    下面的讨论转载自eetop,我选取了一些有意义的讨论,加了我的评注. 楼主zhhzhuawei认为 ===================================== 对于ASIC的前端功能验 ...

  3. 万网免费主机wordpress快速建站教程-域名申请

    在上一篇文章中,小伙伴们已经申请好了万网的免费主机,接下来教大家如何申请域名. 由于万网免费主机要绑定在阿里备案的域名,现在以万网的域名注册为例子. 首先进入万网域名注册页面(http://www.n ...

  4. SqlServer 事务日志传输

    基本概念 可以使用日志传送将事务日志不间断地从一个数据库(主数据库)发送到另一个数据库(辅助数据库).不间断地备份主数据库中的事务日志,然后将它们复制并还原到辅助数据库,这将使辅助数据库与主数据库基本 ...

  5. Linq 与UnitOfWork

    submitchages(linq to sql)或者savechanges(ef)的次数是根据你操作方法的数量决定的,也即是:它只认识自己的提交语句(submtchanges,savechanges ...

  6. swing容器继承重绘问题解决

    swing容器继承重绘问题解决   以JPanel为例,继承JPanel,想动态为器更换背景,这就涉及到重绘问题.一下是本人重写代码: package ui; import java.awt.Grap ...

  7. ReactNative-----环境搭建二(android)

    一.初始化一个ReactNative项目 在指定目录运行命令:react-native init Vince(项目名称)  //其过程就是在使用CLI工具构建项目, 命令行代码 F:\React> ...

  8. 16_MyBatis中期小结

    [MyBatis是什么] MyBatis是一个持久层框架,Mybatis是一个不完全的ORM框架,SQL语句需要程序员自己去编写,但是MyBatis也有映射(输入参数映射.输出结果映射). MyBat ...

  9. ZOJ 3471 Most Powerful(DP + 状态压缩)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257 题目大意:有 n(2<=n<=10) 个原子,每两 ...

  10. JavaWeb网上商城的反思

    不知道从什么时候起,我爱上了写博客,对之前学得的只是进行反思.写了几天课程设计,代码量量8.9千左右. 然后下面文字是我在博客上复制过来的,说得很详细 MVC(Model View Controlle ...