Struts2文件上传Struts2文件上传
10-Struts2文件上传功能开发
原创作者: 黑暗浪子 阅读:4110次 评论:7条 更新时间:2009-10-19 技术要点
本节代码详细说明文件上传功能的开发流程,介绍知识点如下:
文件上传页面和显示上传成功页面代码内容。
UploadAction类中实现上传功能方法和上传文件属性介绍。
struts.xml中UploadAction配置,以及字符编码、文件临时存放路径配置。
上传后所处路径和最终上传成功后效果展示。
演示代码
上传文件页面,这里笔者定义的是多个文件上传。
J...
Struts2文件上传
10-Struts2文件上传功能开发
原创作者: 黑暗浪子 阅读:4110次 评论:7条 更新时间:2009-10-19 技术要点
本节代码详细说明文件上传功能的开发
,介绍
如下:
文件上传页面和显示上传成功页面代码内容。
UploadAction类中实现上传功能方法和上传文件属性介绍。
struts.xml中UploadAction配置,以及字符编码、文件临时存放路径配置。
上传后所处路径和最终上传成功后效果展示。
演示代码
上传文件页面,这里笔者定义的是多个文件上传。
Java代码
1. 2.<%@taglib prefix="s" uri="/struts-tags"%> 3.
4.
5.
6.
上传文件
7.
8.
9.
10.
11.
12.
13. 上传文件: | 14.
15.
16. 再次上传文件: | 17.
18.
19. | 20.
21.
22.
23.
<%@taglib prefix="s" uri="/struts-tags"%>
上传文件
上传文件: |
再次上传文件: |
|
上传文件成功后结果页面
Java代码
1. 2.<%@taglib prefix="s" uri="/struts-tags"%> 3.
4.
5.
6.
上传结果
7.
8.
9. 上传文件:
10.
11.
12.
13.
<%@taglib prefix="s" uri="/struts-tags"%>
上传结果
上传文件:
UploadAction类代码
Java代码
1. 2.import java.io.File;
3.import java.io.FileInputStream;
4.import java.io.FileNotFoundException; 5.import java.io.FileOutputStream;
6.import java.io.IOException;
7.import java.io.InputStream;
8.import java.io.OutputStream;
9.import java.util.List;
10.
11.import org.apache.struts2.ServletActionContext; 12.import com.opensymphony.xwork2.ActionSupport; 13.
14.//文件上传Action
15.public class UploadAction extends ActionSupport { 16. //上传文件存放路径
17. private final static String UPLOADDIR = "/upload";
18. //上传文件集合
19. private List
file;
20. //上传文件名集合
21. private List fileFileName; 22. //上传文件内容类型集合
23. private List fileContentType; 24.
25. public List getFile() { 26. return file;
27. }
28.
29. public void setFile(List file) { 30. this.file = file;
31. }
32.
33. public List getFileFileName() { 34. return fileFileName;
35. }
36.
37. public void setFileFileName(List fileFileName) {
38. this.fileFileName = fileFileName;
39. }
40.
41. public List getFileContentType() { 42. return fileContentType;
43. }
44.
45. public void setFileContentType(List fileContentType) {
46. this.fileContentType = fileContentType; 47. }
48.
49. public String execute() throws Exception { 50. for (int i = 0; i < file.size(); i++) { 51. //循环上传每个文件
52. uploadFile(i);
53. }
54. return "success";
55. }
56.
57. //执行上传功能
58. private void uploadFile(int i) throws FileNotFoundException, IOException {
59. try {
60. InputStream in = new FileInputStream(file.get(i));
61. String dir =
ServletActionContext.getRequest().getRealPath(UPLOADDIR); 62. File uploadFile = new File(dir, this.getFileFileName().get(i));
63. OutputStream out = new FileOutputStream(uploadFile);
64. byte[] buffer = new byte[1024 * 1024]; 65. int length;
66. while ((length = in.read(buffer)) > 0) { 67. out.write(buffer, 0, length); 68. }
69.
70. in.close();
71. out.close();
72. } catch (FileNotFoundException ex) { 73. ex.printStackTrace();
74. } catch (IOException ex) {
75. ex.printStackTrace();
76. }
77. }
78.}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;
//文件上传Action
public class UploadAction extends ActionSupport {
//上传文件存放路径
private final static String UPLOADDIR = "/upload";
//上传文件集合
private List file;
//上传文件名集合
private List fileFileName;
//上传文件内容类型集合
private List fileContentType;
public List getFile() {
return file;
}
public void setFile(List file) {
this.file = file;
}
public List getFileFileName() {
return fileFileName;
}
public void setFileFileName(List fileFileName) {
this.fileFileName = fileFileName;
}
public List getFileContentType() {
return fileContentType;
}
public void setFileContentType(List fileContentType) {
this.fileContentType = fileContentType;
}
public String execute() throws Exception {
for (int i = 0; i < file.size(); i++) {
//循环上传每个文件
uploadFile(i);
}
return "success";
}
//执行上传功能
private void uploadFile(int i) throws FileNotFoundException, IOException {
try {
InputStream in = new FileInputStream(file.get(i));
String dir =
ServletActionContext.getRequest().getRealPath(UPLOADDIR);
File uploadFile = new File(dir, this.getFileFileName().get(i));
OutputStream out = new FileOutputStream(uploadFile);
byte[] buffer = new byte[1024 * 1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
in.close();
out.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
struts.xml配置文件中有关文件上传的配置:
Java代码
1. 2.
3.
4.
5.
6.
7.
8. 9.
10.
11.
12. /jsp/upload.jsp
13. /jsp/result.jsp
14.
15.
16.
/jsp/upload.jsp
/jsp/result.jsp
(1):文件上传页面如图4.8所示。
图4.8 文件上传
(2):选择文件如图4.9所示。
图4.9 选择上传的文件
(3):单击“提交”按钮后文件上传成功页面,并显示上传文件名,如图4.10所示。
图4.10 上传文件成功后效果
(4):两个被上传文件最终在服务器上存放路径效果如图4.11所示。
图4.11 上传文件存放路径图
代码解释
(1)在upload.jsp中通过Form标签和File标签定义了两个上传文件。Struts2标签笔者
会在之后章节里具体介绍,这里只是让读者知道是如何使用标签显示图4.8显示的内容。如
果上传成功,笔者在result.jsp中“[”和“]”之间显示上传文件的文件名,如果是多个文件,以“,”相隔。这些显示格式都是用Property标签定义的。
注意:如果上传文件,在JSP的Form中一定要定义如upload.jsp文件中黑体表示的部分。
method和enctype属性都必须要如代码中所示。这样Form中上传文件才会起作用。
(2)UploadAction文件中先定义了常量UPLOADDIR,它是上传文件上传后存放的文件夹名字。比如笔者使用的是JBoss(附录中有安装和在MyEclipse中部署的操作说明),则在它的已部署Web项目下的upload文件夹中,会有所有上传成功的文件。如图4.11读者也可以看见它的上传文件最终存放路径。
注意:在MyEclipse中开发的“WebRoot”目录下也要新建一个upload文件夹,否则部署后在JBoss的已部署Web项目下将没有upload文件夹。因为部署的时候会将所有“WebRoot”目录下的文件夹和文件都部署到JBoss的已部署Web项目下。
定义好UPLOADDIR后,在定义上传文件的属性变量。也许其中的“fileFileName”和“fileContentType”读者看了有点别扭,尤其是“fileFileName”感觉不符合Java命名规范,但是这两个属性变量是4.1小节中介绍的“fileUpload”拦截器类中的类公有变量名字,只有这样定义,UploadAction执行时候会把在页面上选择的上传文件的属性值放在这两个变量里面,否则调试UploadAction时候会发现这两个变量都会是“null”即空值。不相信的读者可以自行改变这两个变量名再执行上传文件功能进行调试看一下这两个变量得到的值。 注意:因为这里笔者是进行多个文件上传功能开发,因此“file”、“fileFileName”、“fileFileName”属性变量都设定为List类型,其实还可以设定为数组类型。个人觉得没有啥大区别。完全凭个人喜好而定。还有如果读者自己开发单个文件上传,就没必要把它们设定为List类型或数组类型。直接把“file”定义为Java的IO包中的File类型,“fileFileName”、“fileFileName”定义为普通的String类型即字符串类型。 之后在execute方法中,写一个循环,对所有页面中选择的上传文件一个个进行上传。这里笔者运用了重构中的“抽取方法”的方式,将上传文件的功能封装成一个私有方法,名字为“uploadFile”。其中运用了Java的IO包中很多API方法。有对重构和Java的IO功能不了解的读者可以去查阅相关资料去理解掌握,这里不是本以及本节重点,因此不再具体记述。
(3)struts.xml中定义了标签,主要定义了文件名和文件内容显示的字符编码集以及这些被上传文件临时存放路径。
先说明一下标签,顾名思义这是定义整个Web项目的一些常量属性值,如果不定义则在Struts2自带的default.properties(读者们可到自己安装Struts2的文件路径src\core\src\main\resources\org\apache\struts2\下找到)文件中有这些常量的定义,比如在本节struts.xml文件中的“struts.i18n.encoding”和“struts.multipart.saveDir”
在default.properties定义代码如下:
Java代码
1.
2.### This can be used to set your default locale and encoding scheme
3.# struts.locale=en_US
4.struts.i18n.encoding=UTF-8
5.
6.### Parser to handle HTTP POST requests, encoded using the MIME-type
multipart/form-data
7.# struts.multipart.parser=cos
8.# struts.multipart.parser=pell 9.struts.multipart.parser=jakarta 10.# uses javax.servlet.context.tempdir by default 11.struts.multipart.saveDir=
### This can be used to set your default locale and encoding scheme
# struts.locale=en_US
struts.i18n.encoding=UTF-8
### Parser to handle HTTP POST requests, encoded using the MIME-type
multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default struts.multipart.saveDir=
如果不在struts.xml文件中定义,则Web项目会缺省使用default.properties文件中这两个常量属性的定义。一个将使字符编码集变为“UTF-8”,另一个干脆没有任何文件路径指定。而笔者开发的该Web项目缺省支持的字符编码集是“gb2312”,而且需要指定临时上传文件存放路径。(当然如果读者开发的Web项目缺省编码集就是“UTF-8”,而且也并不需要指定临时路径时候,就没必要在struts.xml中定义这两个),因此有必要定义这两个属性符合项目开发要求。
注意:也可以如第3章那样,把这两个属性定义在自定义的struts.properties文件中,具体代码可以如下:
Java代码
1.
2.struts.i18n.encoding =gb2312
3.struts.multipart.saveDir= c:\
struts.i18n.encoding =gb2312
struts.multipart.saveDir= c:\
笔者个人认为比在struts.xml中定义更加好,毕竟Struts2自己也是定义在properties属性文件中,而不是定义在自己的xml配置文件中。(Struts2自带的xml配置文件为struts-default.xml,在4.1小节中已记述)。这里是为了让读者知道struts.xml配置文件也可以配置这些属性,因此写在struts.xml配置文件中。从3.2小节笔者说明struts.xml配置文件时并没有介绍标签这点也可以知道笔者个人其实是不赞同这样的配置手段即在struts.xml中配置标签。
在标签中配置“result”,和第3章类似,将这两个JSP文件的导航流程配置好即可。
(4)开始进行文件上传功能展示,按照如上记述的步骤执行即可。笔者在桌面上新建了两个文本文件,将它们上传到JBoss已部署的Web项目中展示文件上传的upload文件夹下。如图4.11所示。
其实还可以指定上传文件的格式,让它只上传特定类型的文件。比如只能上传文本和xml文件,则在struts.xml需要显示配置“uploadFile”拦截器。如下代码:
Java代码
1.
2.
3.
4. 5.
6.
7.
8. /jsp/upload.jsp
9. /jsp/result.jsp
10.
11.
12.
13.
14.text/plain,application/xml 15. interceptor-ref >
16. interceptor-ref >
17.
18.
/jsp/upload.jsp
/jsp/result.jsp
text/plain,application/xml
interceptor-ref >
interceptor-ref >
定义了一个名为“allowedTypes”的参数,其中在之间的是文件类型,也可以用“,”间隔,表示允许上传多个文件类型。这里允许上传文件类型为txt、xml格式的文件。如果读者不知道各个文件类型的定义,可在自己的JBoss安装目录中的
server\default\deploy\jboss-web.deployer\conf\下的web.xml文件中找到(搜索
即可)。
注意:如果显示配置Struts2自己的缺省拦截器一定要写在“defaultStack”前,否则“fileUpload”拦截器不会执行拦截。因为Struts2中如果某个拦截器执行拦截时候发现自己已经执行过,第二个乃至之后同名的拦截器都不会执行。这里因为“defaultStack”拦截器栈中包含了“fileUpload”拦截器,而“fileUpload”拦截器已经执行拦截了,则不会再
执行拦截。如果把“defaultStack”拦截器栈放在“fileUpload”拦截器前配置,则只执行“defaultStack”拦截器栈中的“fileUpload”拦截器,这里是没有定义“allowedTypes”的,Struts2缺省默认的是支持所有文件类型。因此它会支持所有文件类型的文件上传。因
此再设定“allowedTypes”就没有任何意义了。
附件下载:
11-Struts2文件下载功能开发
原创作者: 黑暗浪子 阅读:8275次 评论:4条 更新时间:2009-10-19 技术要点
本节代码详细说明文件下载功能的开发流程,介绍知识点如下:
上传成功页面重修改后支持文件下载代码内容。
DownloadAction文件下载功能开发。
struts.xml中DownloadAction配置,以及支持文件名为中文字符的文件下载。
下载文件流程展示。
演示代码
上传成功页面,这里笔者让其在每个上传文件后提供“下载”链接。
Java代码
1. 2.<%@taglib prefix="s" uri="/struts-tags"%> 3.
4. 上传文件:
5.
6.
7. 8.
9.
10.
11.
12. |
13.
14.
15. 16. 下载
20. |
21.
22.
23.
24.
<%@taglib prefix="s" uri="/struts-tags"%>
上传文件:
DownLoadAction类代码
Java代码
1. 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.}
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+fi
leName);
}
//如果下载文件名为中文,进行字符编码转换
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配置文件中有关文件下载的配置:
Java代码
1. 2.
3.
4.
5.
6. 7. 8.
9. text/plain
10.
11. 12. attachment;filename="${downloadChineseFileName}"
13.
14.
15. downloadFile
16.
17.
18.
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. 2.
这里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,选择在本机上存放下载文件的路径即可完成下载文件功能。
本文档为【Struts2文件上传】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。