struts文件上传下载.docx
《struts文件上传下载.docx》由会员分享,可在线阅读,更多相关《struts文件上传下载.docx(30页珍藏版)》请在冰豆网上搜索。
struts文件上传下载
Struts2文件下载功能开发
技术要点
本节代码详细说明文件下载功能的开发流程,介绍知识点如下:
上传成功页面重修改后支持文件下载代码内容。
DownloadAction文件下载功能开发。
struts.xml中DownloadAction配置,以及支持文件名为中文字符的文件下载。
下载文件流程展示。
演示代码
上传成功页面,这里笔者让其在每个上传文件后提供“下载”链接。
Java代码
1.
------------------------文件名:
result.jsp------------------->
2.<%@taglib prefix="s" uri="/struts-tags"%>
3.
4. 上传文件:
5.
24.
------------------------文件名:
result.jsp------------------->
<%@taglibprefix="s"uri="/struts-tags"%>
上传文件:
--循环显示上传成功文件名-->
iteratorvalue="fileFileName"status="fn">
--上传成功文件名--> property/>
| --下载文件链接内容为定义的下载Action--> --下载文件名作为链接参数fileName值,用OGNL表达式表达--> urlvalue='download.action'> paramname='fileName' value='fileFileName[#fn.getIndex()]'/>
url>">下载
|
iterator>
DownLoadAction类代码
Java代码
1.
------------文件名:
DownLoadAction.java ------------------>
2.import java.io.InputStream;
3.import java.io.UnsupportedEncodingException;
4.
5.import org.apache.struts2.ServletActionContext;
6.import com.opensymphony.xwork2.ActionSupport;
7.
8.public class DownLoadAction extends ActionSupport {
9. //下载文件原始存放路径
10. private final static String DOWNLOADFILEPATH="/upload/";
11. //文件名参数变量
12. private String fileName;
13.
14. public String getFileName() {
15. return fileName;
16. }
17.
18. public void setFileName(String fileName) {
19. this.fileName = fileName;
20. }
21.
22. //从下载文件原始存放路径读取得到文件输出流
23. public InputStream getDownloadFile() {
24. return
25.ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);
26. }
27. //如果下载文件名为中文,进行字符编码转换
28. public String getDownloadChineseFileName() {
29. String downloadChineseFileName = fileName;
30.
31. try {
32. downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");
33. } catch (UnsupportedEncodingException e) {
34. e.printStackTrace();
35. }
36.
37. return downloadChineseFileName;
38. }
39.
40. public String execute() {
41. return SUCCESS;
42. }
43.}
------------文件名:
DownLoadAction.java------------------>
importjava.io.InputStream;
importjava.io.UnsupportedEncodingException;
importorg.apache.struts2.ServletActionContext;
importcom.opensymphony.xwork2.ActionSupport;
publicclassDownLoadActionextendsActionSupport{
//下载文件原始存放路径
privatefinalstaticStringDOWNLOADFILEPATH="/upload/";
//文件名参数变量
privateStringfileName;
publicStringgetFileName(){
returnfileName;
}
publicvoidsetFileName(StringfileName){
this.fileName=fileName;
}
//从下载文件原始存放路径读取得到文件输出流
publicInputStreamgetDownloadFile(){
return
ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);
}
//如果下载文件名为中文,进行字符编码转换
publicStringgetDownloadChineseFileName(){
StringdownloadChineseFileName=fileName;
try{
downloadChineseFileName=newString(downloadChineseFileName.getBytes(),"ISO8859-1");
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
returndownloadChineseFileName;
}
publicStringexecute(){
returnSUCCESS;
}
}
struts.xml配置文件中有关文件下载的配置:
Java代码
1.
------------------文件名:
struts.xml----------------->
2.
3.
-- 下载文件的Action定义 -->
4.
5.
-- 设置文件名参数,由页面上传入 -->
6.
7.
8.
-- 下载文件类型定义 -->
9. text/plain
10.
-- 下载文件处理方法 -->
11.
12. attachment;filename="${downloadChineseFileName}"
13.
14.
-- 下载文件输出流定义 -->
15. downloadFile
16.
17.
18.
------------------文件名:
struts.xml----------------->
--下载文件的Action定义-->
--设置文件名参数,由页面上传入-->
--下载文件类型定义-->
text/plain
--下载文件处理方法-->
attachment;filename="${downloadChineseFileName}"
--下载文件输出流定义-->
downloadFile
(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显示的内容。
特别指出标签为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页面上传入,所以这里只是定义,没有具体给它赋任何值
在标签中定义了type属性,值为“stream”。
如果是下载文件功能开发,DownLoadAction一定要设置type属性,而且值为“stream”。
这是因为在Struts2自带的xml配置文件为struts-default.xml中有关于“stream”的result返回类型的定义,代码如下:
Java代码
1.
-------------------文件名:
struts-default.xml-------------->
2.
-------------------文件名:
struts-default.xml-------------->
这里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,选择在本机上存放下载文件的路径即可完成下载文件功能。
10-Struts2文件上传功能开发|12-Struts2标签使用原理解疑
评论共3条发表评论
3楼release2009-10-2815:
01引用
上个项目遇到过CentOS下的乱码问题,需要在下载方法中显示定义
ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;filename="+newString(file_name.getBytes("gb2312"),"iso-8859-1);
楼主归纳的很详尽了
2楼黑暗浪子2009-10-1909:
10引用
release写道
楼主你确定用LINUX做服务器你的下载不会产生中文乱码?
不好意思,我没有用linux试过。
如果有缺陷,你可以帮我补充,谢谢~
1楼release2009-10-1716:
49引用
楼主你确定用LINUX做服务器你的下载不会产生中文乱码?
发表评论
Struts2文件上传功能开发
技术要点
本节代码详细说明文件上传功能的开发流程,介绍知识点如下:
文件上传页面和显示上传成功页面代码内容。
UploadAction类中实现上传功能方法和上传文件属性介绍。
struts.xml中UploadAction配置,以及字符编码、文件临时存放路径配置。
上传后所处路径和最终上传成功后效果展示。
演示代码
上传文件页面,这里笔者定义的是多个文件上传。
Java代码
1.
---------------------文件名:
upload.jsp----------------->
2.<%@taglib prefix="s" uri="/struts-tags"%>
3.
4.
5.
6.
上传文件 7.
8.
9.
-- 上传文件表单定义 -->
10. form action="upload" method="post" enctype="multipart/form-data">
11.
12.
-- 上传文件标签定义 -->
13.
上传文件: file name="file">
file> | 14.
15.
16.
再次上传文件: file name="file">
file> | 17.
18.
19.
submit name="submit" value="提交"> submit> | 20.
21.
form>
22.
23.
---------------------文件名:
upload.jsp----------------->
<%@taglibprefix="s"uri="/struts-tags"%>
上传文件