技术要点
本节代码详细说明文件下载功能的开发流程,介绍知识点如下:
= 上传成功页面重修改后支持文件下载代码内容。
= DownloadAction 文件下载功能开发。
= struts.xml 中 DownloadAction 配置,以及支持文件名为中文字符的文件下载。
= 下载文件流程展示。
演示代码
上传成功页面,这里笔者让其在每个上传文件后提供“下载”链接。
<!------------------------------------------- 文件名:result.jsp-------------------------------->
<%@taglib prefix="s" uri="/struts-tags"%>
<body>
上传文件:
<table>
<!-- 循环显示上传成功文件名 -->
<s:iterator value="fileFileName" status="fn">
<tr>
<td>
<!-- 上传成功文件名 -->
<s:property />
</td>
<td>
<!-- 下载文件链接内容为定义的下载Action -->
<!-- 下载文件名作为链接参数fileName 值,用OGNL 表达式表达 -->
<a href="<s:url value='download.action'>
<s:param name='fileName'
value='fileFileName[#fn.getIndex()]'/>
</s:url>"> 下载</a>
</td>
</tr>
</s:iterator>
</table>
</body>
DownLoadAction 类代码
<!------------------------------------------- 文件名: DownLoadAction .java -------------------------------->
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownLoadAction extends ActionSupport {
// 下载文件原始存放路径
private final static String DOWNLOADFILEPATH ="/upload/";
// 文件名参数变量
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
// 从下载文件原始存放路径读取得到文件输出流
public InputStream getDownloadFile() {
return
ServletActionContext.getServletContext ().getResourceAsStream(DOWNLOADFILEPATH +fileName);
}
// 如果下载文件名为中文,进行字符编码转换
public String getDownloadChineseFileName() {
String downloadChineseFileName = fileName;
try {
downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downloadChineseFileName;
}
public String execute() {
return SUCCESS ;
}
}
struts.xml 配置文件中有关文件下载的配置:
<!------------------------------------------- 文件名: struts.xml-------------------------------->
<struts>
<!-- 下载文件的 Action 定义 -->
<action name="download" class="action.DownLoadAction">
<!-- 设置文件名参数,由页面上传入 -->
<param name="fileName"></param>
<result name="success" type="stream">
<!-- 下载文件类型定义 -->
<param name="contentType">text/plain</param>
<!-- 下载文件处理方法 -->
<param name="contentDisposition">
attachment;filename="${downloadChineseFileName}"
</param>
<!-- 下载文件输出流定义 -->
<param name="inputName">downloadFile</param>
</result>
</action>
</struts>
( 1 ):文件开始下载页面如图 4.12 所示。
图 4.12 文件下载
( 2 ):单击“下载”链接,比如点“下载文件 1.txt ”文件右边“下载”链接,出现对话框如图 4.13 所示。
图 4.13 下载文件处理方式
( 3 ):单击“保存”按钮后选择下载文件存放路径,如图 4.14 所示。
图 4.14 下载文件选择存放路径
代码解释
( 1 )在 result.jsp 中通过 iterator 标签和 url 标签定义了“ fileFileName ”的循环显示以及链接。其中有关“ status ”和 OGNL 表达式笔者会在之后章节里具体介绍,这里只是让读者知道是如何使用标签显示图 4.12 显示的内容。特别指出 <param> 标签为 downloadAction 定义了一个参数,该参数名为“ fileName ”,因为在 4.4.1 小节中笔者定义的“ fileFileName ”是个 List 类型的数据集合,因此利用 OGNL 表达式将文件名作为“ fileName ”参数值传入 downloadAction 中。
( 2 ) DownLoadAction 文件中先定义了常量 DOWNLOADFILEPATH ,它是下载文件在服务器存放的路径名,也就是 4.4.1 小节中上传文件在服务器存放的路径名。
定义好 DOWNLOADFILEPATH 后,在定义 DownLoadAction 的属性变量。因为在 result.jsp 中定义了参数“ fileName ”,则它作为 DownLoadAction 的属性变量,需要定义相应的 getter 、 setter 方法。
然后定义了 getDownloadFile 方法,它返回的是一个文件流,表明将被下载文件转换为输出流,方便下载。利用 Struts2 自带的“ ServletActionContext ”类的 API 把下载文件存放路径作为方法参数,读取下载文件,将其转换为文件流。
还有一个 getDownloadChineseFileName 方法,该方法主要作用是将文件名为中文字符的文件进行文件名的字符编码集合转换。因为在 Web 系统中由 JSP 等视图页面传入的变量值,特别是中文字符的变量。缺省的字符编码集合都是“ ISO8859-1” ,因此利用 Java 的字符串类的 API ,将字符编码转成开发需要的字符编码集。防止中文字符乱码问题发生。
( 3 ) struts.xml 中定义了名为“ download ”的 Action 。其中它自己的参数“ fileName ”因为在这里它的值会从 JSP 页面上传入,所以这里只是定义,没有具体给它赋任何值
在 <result> 标签中定义了 type 属性,值为“ stream ”。如果是下载文件功能开发, DownLoadAction 一定要设置 type 属性,而且值为“ stream ”。这是因为在 Struts2 自带的 xml 配置文件为 struts-default.xml 中有关于“ stream ”的 result 返回类型的定义,代码如下:
<!------------------------------------------- 文件名: struts-default.xml-------------------------------->
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
这里 Struts2 定义了 result 返回类型为“ stream ”,这个 result 类型主要是处理文件的输入和输出流时候需要使用的。因为下载文件就是把文件转换成输入输出流,将其从一个文件路径放到另外一个文件路径中去。所以肯定要设置这个 result 类型的。
“ contentType ”、“ contentDisposition ”、“ inputName ”都是这个 result 的属性。“ contentType ”就是文件类型。这里因为下载的文件是文本文件,因此设定的值为文本文件类型,具体各个文件类型如何定义, 4.4.1 小节已经介绍过,这里不再做说明。“ contentDisposition ”是指定下载文件处理方式,如图 4.13 就是处理方式的效果。特别指出如果“ contentDisposition ”定义的值把前面的“ attachment ”去掉,则下载方式不是以附件方式下载,如果单击“下载”链接,则会把下载文件的内容显示在浏览器中。读者可以去试验一下。这里有个“ ${downloadChineseFileName} ”,这就是在 DownLoadAction 中定义 getDownloadChineseFileName 方法的目的, ${downloadChineseFileName} 是 OGNL 的表达式,它显示了“ downloadChineseFileName ”变量的具体值,因为在 DownLoadAction 中定义 getDownloadChineseFileName 方法,则把已经转换成符合需要字符编码集的下载文件名作为下载文件方式对话框中显示的名称,不会造成任何乱码问题。“ inputName ”是最关键的一个属性,也是一定要定义的属性,“ inputName ”参数中定义的值“ downloadFile ”就是 DownLoadAction 中 getDownloadFile 方法返回的文件流名字。在 Struts2 中 Acion 用前缀名为 get 的方法得到各种属性的值,这些属性有些是在 Action 中定义,有些就像本示例在配置文件中利用 OGNL 表达式或直接定义。
( 4 )开始进行文件下载功能展示,按照如上记述的步骤执行即可。笔者将两个文本文件上传上去,然后在上传成功页面对具体的文件进行下载。在图 4.13 中单击“保存”按钮就显示图 4.14 ,选择在本机上存放下载文件的路径即可完成下载文件功能。
更多信息请查看 java进阶网 http://www.javady.com/index.php/category/thread