实现使用Struts2文件上传和文件下载:
注意点:
(1)对应表单的file1和私有成员变量的名称必须一致
private File file1;
(2)限制上传文件大小和类型的格式是定死的,最好记住,记不住知道去哪里查;虽然不做要求,完全懂框架内部的机制,但是找一些东西还是需要能找到的,这样你可以很好的实现一些功能,因为这些关键字都是框架底层定义好的,图一是找到配置上传文件大小的关键字,图二是找到设置文件类型的关键字。
1:第一步,引入核心包,省略;
2:在web.xml配置过滤器,如下所示:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 struts2_upload20170306
4
5 index.html
6 index.htm
7 index.jsp
8 default.html
9 default.htm
10 default.jsp
11
12
13
14
15
16
17
18 struts2
19
20 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
21
22
23
24 struts2
25
26 /*27 28
29
3:创建上传文件的页面uploadfile.jsp,源码如下所示:
需要注意form标签需要引入这句:enctype="multipart/form-data"
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
上传文件的页面8
9
10
11
12 文件名:
13 文件:
14
15
16
17
4:开发action,实现对文件上传后台的处理:已经加了详细的注释,需要注意的地方都加了注释;
1 packagecom.bie.upload;2
3 importjava.io.File;4
5 importorg.apache.commons.io.FileUtils;6 importorg.apache.struts2.ServletActionContext;7
8 importcom.opensymphony.xwork2.ActionSupport;9
10 /**
11 *@authorBieHongLi12 *@version创建时间:2017年3月6日 上午10:43:5213 * 上传文件的Action处理14 *15 * struts2文件上传16 * 1:struts2中文件上传拦截器帮助我们完成上传文件的功能;17 *18 *19 */
20 public class UploadAction extendsActionSupport{21
22 private static final long serialVersionUID = 1L;23 //对应表单的file1
24 privateFile file1;25 //当前上传的文件名
26 privateString file1FileName;27 //文件类型(MIME)
28 privateString file1ContentType;29 public voidsetFile1(File file1) {30 this.file1 =file1;31 }32 public voidsetFile1FileName(String file1FileName) {33 this.file1FileName =file1FileName;34 }35 public voidsetFile1ContentType(String file1ContentType) {36 this.file1ContentType =file1ContentType;37 }38
39
40 @Override41 public String execute() throwsException {42 //开始拿到上传的文件,进行处理,上传之前,要创建一个upload目录
43 System.out.println("测试上传的文件");44 //把文件上传到upload目录,获取上传的目录路径
45 String path=ServletActionContext.getServletContext().getRealPath("/upload");46 //创建目标文件对象,文件名file1FileName,格式_FileName
47 File destFile=newFile(path,file1FileName);48 //把上传的文件,拷贝到目标文件中
49 FileUtils.copyFile(file1, destFile);50
51 returnSUCCESS;52 }53
54
55 }
5:由于练习阶段,需要很多测试,所以为了方便,特别引入了全局配置,总配置文件和各个项目的配置文件,下面是源码:
在全局配置文件中实现限制上传文件的大小,在分配置文件中实现限制上传文件的类型;
1 <?xml version="1.0" encoding="UTF-8" ?>
2 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4 "http://struts.apache.org/dtds/struts-2.0.dtd">
5
6
7
8
9
10
11
12 /uploadfile/success.jsp
13
14
15
16
17 txt,jpg,gif,png
18
19
20
21
23 /uploadfile/error.jsp
24
25
26
27
1 <?xml version="1.0" encoding="UTF-8" ?>
2 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4 "http://struts.apache.org/dtds/struts-2.0.dtd">
5
6
7
8
9
10
11
12
13
1 <?xml version="1.0" encoding="UTF-8" ?>
2 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4 "http://struts.apache.org/dtds/struts-2.0.dtd">
5
6
7
8
9
10
11
12
13
14
15
6:最后完成成功页面和错误页面的跳转,源码如下所示:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
成功的页面8
9
10 成功的页面11
12
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
成功的页面8
9
10 error.jsp11
12
13
14
15
演示效果如下所示:分别演示了限制不符合文件类型的上传和符合文件类型的上传
struts2实现文件的下载是在上面上传的基础上完成的,所以直接写下载的代码:
1:实现文件的下载,首先创建一个list.jsp页面,用于展示文件,源码如下所示:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
8
下载的页面9
10
11
12
13
14
15
编号16
文件名17
操作18
19
20
21
${fn.count}22
${fileName }23
24
25
26
27
28 下载
29
30
31
32
33
34
35
36
2:然后开发Action,创建一个文件DownActin.java,源码如下所示:
1 packagecom.bie.upload;2
3 importjava.io.File;4 importjava.io.InputStream;5 importjava.io.UnsupportedEncodingException;6 importjava.net.URLEncoder;7 importjava.util.Map;8
9 importorg.apache.struts2.ServletActionContext;10
11 importcom.opensymphony.xwork2.ActionContext;12 importcom.opensymphony.xwork2.ActionSupport;13
14 /**
15 *@authorBieHongLi16 *@version创建时间:2017年3月6日 下午1:54:0017 * 文件下载的2种方式:18 * 方式1:通过response对象向浏览器写入字节流数据,设置下载的响应头19 * 方式2:struts的方式20 */
21 public class DownAction extendsActionSupport{22
23
24 private static final long serialVersionUID = 1L;25
26 //第一步:显示所有要下载的文件的列表
27 public String list() throwsException {28 //1:得到upload目录路径
29 String path=ServletActionContext.getServletContext().getRealPath("/upload");30 //2:目录对象
31 File file=newFile(path);32 //3:得到所有要下载的文件的文件名
33 String[] fileNames=file.list();34 //4:保存
35 ActionContext ac=ActionContext.getContext();36 //5:得到代表request的Map(第二种方式)
37 Map request=(Map)ac.get("request");38
39 request.put("fileNames", fileNames);40 return "list";41 }42
43 //*************2:文件下载************************/44 //2.1:获取要下载的文件的文件名,设置字符集,前台页面提交的是以get方式提交的
45 privateString fileName;46 public voidsetFileName(String fileName) {47 //处理传入的参数种问题(get提交)
48 try{49 fileName=new String(fileName.getBytes("ISO8859-1"),"UTF-8");50 } catch(UnsupportedEncodingException e) {51 throw newRuntimeException();52 }53 //把处理好的文件名,赋值
54 this.fileName =fileName;55 }56
57 //2.2:下载提交的业务方法(在struts.xml中配置返回stream)
58 public String down() throwsException {59 return "download";60 }61
62 //2.3:返回流的方法
63 publicInputStream getAttrInputStream(){64 return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName);65 }66
67 //2.4:下载显示的中文名,(浏览器显示的文件名)
68 publicString getDownFileName(){69 try{70 //import java.net.URLEncoder;
71 fileName = URLEncoder.encode(fileName,"UTF-8");72 }catch(Exception e){73 throw newRuntimeException();74 }75
76 returnfileName;77 }78 }
3:接着配置struts.xml的分文件fileupload.xml,配置如下所示:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4 "http://struts.apache.org/dtds/struts-2.0.dtd">
5
6
7
8
9
10
11
12 /uploadfile/success.jsp
13
14
15
16
18 txt,jpg,gif,png
19
20
21
22
24 /uploadfile/error.jsp
25
26
27
28
29
30
31 /uploadfile/list.jsp
32
33
34
35
36 application/octet-stream
37
38 attrInputStream
39
40 attachment;filename="${downFileName}"
41
42 1024
43
44
45
46
47
演示效果如下图所示:
下面简单说一下如何找一些配置或者定义好的文件名:
对于框架的要求,不需要研究底层,当然你有精力,可以去研究,对于一个又一个新的框架的产生,我感觉个人能熟练应用和知道底层是如何工作的以及底层的定义名词,这就足够了。
1:首先应该会找到struts-default.xml这个文件,以及配置文件里面的一些配置,如这次使用下载文件所使用的stream流api里面的案例:
2:这次上传文件所使用的过滤器,你也应该能找到,这样才可以会用他们定义好的属性:
革命尚未成功,别先生仍需努力啊!!!