Struts2中文件上传的两种方式

简介:

Struts2中的文件上传,方式很多,大体原理不变。一种是通过POST请求上传,另一种Struts2封装好的字段驱动的方式上传。


1.第一种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public  String uploadImage() {
         boolean  result =  false ;
         /**
         *获取request对象,在Struts2或者Servlet中同理
         */
         HttpServletRequest req = ServletActionContext.getRequest();
         DiskFileItemFactory factory =  new  DiskFileItemFactory();
         factory.setRepository( new  File(getUploadFileSavePath(req)));
         factory.setSizeThreshold( 1024  1024  2 );
                                                                                                                                                                                                                                                                
         ServletFileUpload upload =  new  ServletFileUpload(factory);
         List<?> items =  null ;
         try  {
             items = upload.parseRequest(req);
         catch  (FileUploadException e1) {
             e1.printStackTrace();
         }
         for  ( int  i =  0 ; i < items.size(); i++) {
             FileItem item = (FileItem) items.get(i);
             if  (item.isFormField()) {
                 continue ;
             else  {
                 String fileName = item.getName();
                 /**
                 *StringUtils工具生成时间戳作为文件名,可扩展
                 */
                 String dstFile = StringUtils.timeStamp()
                         + fileName.substring(fileName.lastIndexOf( '.' ));
                 String dstFileName = getUploadFileSavePath(req)
                         + File.separator + dstFile;
                 FileOutputStream fos;
                 try  {
                     fos =  new  FileOutputStream(dstFileName);
                     if  (item.isInMemory()) {
                         InputStream in;
                         in = item.getInputStream();
                         byte [] btn =  new  byte [ 1024 ];
                         int  size;
                         while  ((size = in.read(btn)) >  0 ) {
                             fos.write(btn,  0 , size);
                         }
                         in.close();
                         fos.close();
                     }
                 catch  (FileNotFoundException e) {
                     e.printStackTrace();
                 catch  (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
     }

依赖的上传组件是:org.apache.commons.fileupload

原理:通过请求来判断Form中的字段类型,属于文件类型则上传文件。

2.第二种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
public  class  UploadAction  extends  ActionSupport {
     private  static  final  long  serialVersionUID = 7545315675701301471L;
     /**
      * 上传文件
      */
     private  File ccImage;
     /**
      * 下面的两个字段因ccImage字段存在,而且命名分别是xxxContentType,xxxFileName
      */
     /**
      * 文件类型(Meta信息)
      */
     private  String ccImageContentType;
     /**
      * 上传的文件名
      */
     private  String ccImageFileName;
     private  HttpServletRequest request = ServletActionContext.getRequest();
     /**
      * 获取工程的访问URL根路径:例如:http://127.0.0.1:8080/工程名
      */
     private  String basePath = request.getScheme() +  "://"
             + request.getServerName() +  ":"  + request.getServerPort()
             + request.getContextPath();
     /**
      * 上传文件
      *
      * @return
      */
     public  String upload() {
         boolean  result =  false ;
         String dstFile = StringUtils.timeStamp()
                 + ccImageFileName.substring(ccImageFileName.lastIndexOf( '.' ));
         String dstFileName = getUploadFileSavePath() + File.separator + dstFile;
         File destFile =  new  File(dstFileName);
         try  {
             FileUtils.copyFile(ccImage, destFile);
         catch  (IOException e) {
             e.printStackTrace();
         }
         return  result ? Action.SUCCESS : Action.ERROR;
     }
     /**
      * 获取上传文件的路径
      *
      * @return
      */
     private  String getUploadFileSavePath() {
         @SuppressWarnings ( "deprecation" )
         /**
          * Const.UPLOAD_HEAD_PATH:可配置的变量
          */
         String path = request.getRealPath(Const.UPLOAD_HEAD_PATH);
         File dir =  new  File(path);
         if  (!dir.exists()) {
             dir.mkdirs();
         }
         return  path;
     }
     /**
      * Struts2对于上传文件进行了封装,set方法必须存在,通过set方法和为字段进行赋值
      * @return
      */
     public  String getCcImageContentType() {
         return  ccImageContentType;
     }
     public  void  setCcImageContentType(String ccImageContentType) {
         this .ccImageContentType = ccImageContentType;
     }
     public  File getCcImage() {
         return  ccImage;
     }
     public  void  setCcImage(File ccImage) {
         this .ccImage = ccImage;
     }
     public  String getCcImageFileName() {
         return  ccImageFileName;
     }
     public  void  setCcImageFileName(String ccImageFileName) {
         this .ccImageFileName = ccImageFileName;
     }
     public  String getBasePath() {
         return  basePath;
     }
     public  void  setBasePath(String basePath) {
         this .basePath = basePath;
     }
}

上面的UploadAction类中的属性有File,String其中后两个属性因为第一个属性存在而存在,有一定的关联性,这里既可以看成是属性驱动,也可以是模型驱动。Struts2对文件上传的这个过程进行了很好的封装,这里注意属性的命名和set方法即可。

Struts上传文件配置:

1
2
<!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
< constant  name = "struts.multipart.maxSize"  value = "2097152"  />

Action的配置

1
2
3
4
< interceptor-ref  name = "fileUpload" >
     < param  name = "allowedTypes" >image/bmp,image/png,image/gif,image/jpeg</ param >
</ interceptor-ref >
< interceptor-ref  name = "defaultStack"  />

关于Struts的文件上传拦截器参见类:

org.apache.struts2.interceptor.FileUploadInterceptor


末了:写这篇文章,不在内容,在意义,在开发中上传文件遇到了一些问题,百度了一下,很多都是泊来品,于是回到官方文档,很多问题都是能解决了,纪念一下,警示自己少百度,少谷歌,溯本逐源才能做好真学问。



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1303172,如需转载请自行联系原作者

相关文章
|
前端开发 JavaScript Java
struts2的文件上传
在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在...
937 0
Struts2文件上传
1  在Struts2中上传文件需要 commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar 这两个包。  2  确认页面form表单上的提交方式为POST,enctype属性的值为“multipart/form-data”。
777 0
Struts1——文件上传
       在struts1中,框架本身引入commons-fileupload:         只需几行代码+配置,便可以完成文件的上传。      首先使我们form表单里面的配置:   然后在ActionForm中,将我们的input为file的提交项对应为FormFile类型: 在Action中,通过我们的ActionForm就可以直接拿到上传文件的信息,进行存盘,入库等操作。
983 0
|
Java Spring Apache
struts2 文件上传 三种方式
struts.multipart.maxSize=10240000:用于限制上传文件的大小struts.multipart.allowedTypes=.xls,.zip:用于限制上传文件类型struts.multipart.parser=pell:解决上传空文件的报错问题 struts.multipart.saveDir:该属性指定上传文件的临时保存路径,该属性的默认值是javax.se
1385 0