struts2下载文件时出现:java.lang.ClassCastException: java.io.ByteArrayInputStream cannot be cast to 错误

* 在学习Struts2下载文件的时候出现了java.lang.ClassCastException: java.io.ByteArrayInputStream cannot be cast to java.lang.String 的问题。后来阅读了一些博客解决了这个问题,顺便在这里总结一下Struts2文件下载。*

Struts2.xml文件:

<struts>
 <package name="up" extends="struts-default" namespace="/">   

       <action name="down" class="action.DownloadAction" method="getTargetFile">  
             <result type="stream">   
             <param name="inputPath">/store/</param>    
             <param name="contentType">image/gif</param> 
            <param name="inputName">targetFile</param>
            <param name="contentDisposition">attachment;filename="123.gif"</param>  
             <param name="bufferSize">4096</param> 
            </result>  
        </action>  
      </package>
</struts>   

负责下载的Action

package action;

import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

public class DownloadAction {
    private String downLoad;  //负责接收文件名  
    private String inputPath;  //源文路径  

    /* 属性的GET SET 省略 */  


/* 带有InputStream返回值的(get)方法 */  
   public InputStream getTargetFile(){  

        return
                   ServletActionContext.getServletContext().getResourceAsStream(inputPath+downLoad);  
    }  

   public String execute()  {  
        return "success";  
   }  

}

JSP代码:

 <body>
    <a href="down.action?downLoad=logo.gif">下载</a>    
<!-- 传值给ACTION类中的downLoad属性,指定下载的文件名称  -->  

  </body>

可能高手一看就知道问题出在哪里了,可是我们这些菜鸟就容易犯这样的错误。问题就出在不应该给action指定method属性,因为action配置上method属性后,struts2默认会把 ByteArrayInputStream强制转成String类型。那要在哪里配置哪个方法来执行下载操作,返回下载文件流。其实<param name="inputName">targetFile</param> 就已经指定了DownAction中的getTargetFile()返回下载文件流。所以我们只要去掉action的method属性,然后添加<param name="inputName">***</param>,同时在DownloadAction中添加InputStream get***(){/*code*/}即可

好了,下面顺便总结一下Struts2文件下配置的各个param的含义

 <action name="down" class="action.DownloadAction" method="getTargetFile">  
    <!-- 为action中的inputPath属性初始化值 -->
   <param name="inputPath">/store/</param>    

   <result type="stream">  <!-- 指定类型stream 以流形式进行传输 ,注意后面的param是result的子元素-->  
       <param name="contentType">image/gif</param> <!--指定文件内容类型和互联网MIME标准中的规定类型一致,
                                                    例如text/plain代表纯文本,text/xml表示XML,image/gif
                                                    代表GIF图片,image/jpeg代表JPG图片 -->  

       <param name="contentDisposition">attachment;filename="123.gif"</param>  
    <!--指定文件以附件形式弹出下载对话框;filename="123.gif" 指定下载对话框中显示的文件名称;  
    文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。  
    如果直接写filename="123.gif",默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="123.gif"-->  
       <param name="bufferSize">4096</param> <!--指定下载缓冲区的大小-->  
  </result>  
</action>  

特别感谢,看了这两篇博客才弄明白这个问题,如有不清楚的地方,大家可以直接点击查看。

http://newerdragon.iteye.com/blog/1664035
http://blog.csdn.net/xinteng2012/article/details/30065541

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页