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

时间:2023-01-06 11:49:55

* 在学习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