北在北方

太白枝头看,花开不计年,杯中浮日月,楼外是青天。

导航

Struts2文件上传

Posted on 2012-05-18 00:00  CN.programmer.Luxh  阅读(626)  评论(0编辑  收藏  举报

  struts2的文件上传是用拦截器实现的,我们可以不用去关心底层的实现,使得上传文件变得很简单。

  Action代码:

  

 1 package com.test;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.text.SimpleDateFormat;
 6 import java.util.Date;
 7 import java.util.Random;
 8 
 9 import org.apache.commons.io.FileUtils;
10 import org.apache.struts2.ServletActionContext;
11 import com.opensymphony.xwork2.ActionSupport;
12 
13 
14 /**
15  * Action that file upload
16  * @author Luxh
17  */
18 public class FileUploadAction extends ActionSupport{
19     
20     private static final long serialVersionUID = 1L;
21     
22     /**
23      * 上传的文件
24      *  该属性名称要和页面中的<input type="file" name="file">中的name一致
25      */
26     private File file;
27     /**文件名*/
28     private String fileFileName;
29     /**文件类型*/
30     private String fileContentType;
31     
32     
33     /**
34      * 上传文件
35      * @return 
36      * @throws IOException 
37      */
38     public String uploadFile() throws IOException {
39         if(file != null) {
40             //获取存放文件的目录
41             String saveDir = ServletActionContext.getServletContext().getRealPath("D:/test/upload");
42             File dirFile = new File(saveDir);
43             //如果目录不存在,就创建目录
44             if(!dirFile.exists()) {
45                 dirFile.mkdir();
46             }
47             
48             //获取目标文件名
49             String targetFileName = generateFileName(fileFileName);
50             //生成目标文件
51             File targetFile = new File(saveDir,targetFileName);
52             //复制文件到存放路径,FileUtils是apache旗下commons-io包中的一个工具类
53        FileUtils.copyFile(file,targetFile);
54             
55             //实际中可能需要将一些文件信息保存到数据中,比如原始文件名称、文件大小、文件存放路径等信息
56             //可调用相关的业务逻辑进行处理
57         }
58         return SUCCESS;
59         
60     }
61     
62     
63     /**
64      * 生成新文件名
65      * @param fileName
66      * @return
67      */
68     private String generateFileName(String fileName) {
69         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
70         String formatDate = sdf.format(new Date());
71         int random = new Random().nextInt(1000);
72         int position = fileName.lastIndexOf("."); 
73         String extension = fileName.substring(position); 
74         return formatDate + random + extension;     
75     }
76     
77     
78     public File getFile() {
79         return file;
80     }
81     public void setFile(File file) {
82         this.file = file;
83     }
84     public String getFileFileName() {
85         return fileFileName;
86     }
87     public void setFileFileName(String fileFileName) {
88         this.fileFileName = fileFileName;
89     }
90     public String getFileContentType() {
91         return fileContentType;
92     }
93     public void setFileContentType(String fileContentType) {
94         this.fileContentType = fileContentType;
95     }
96 
97 
98 }

 

  

  配置文件如下:

  

 1     <!-- 设置文件上传大小限制 -->
 2     <constant name="struts.multipart.maxSize" value="10000000"/>
 3     <!--文件临时存放目录 -->
 4     <constant name="struts.multipart.saveDir" value="D:/temp"/>
 5 
 6     <package name="default" namespace="/" extends="struts-default">
 7               <!--  默认的全局拦截器 -->
 8               <default-interceptor-ref name="defaultStack"/>
 9 
10      
11               <!-- 文件上传 -->
12              <action name="uploadFile" class="com.test.FileUploadAction" method="uploadFile">
13                 <!-- 如果配置了全局拦截器栈 defaultStack,是不需要再配置拦截器fileUpload
14                     因为defaultStack中已包含fileUpload拦截器
15                 -->
16                 <!--<interceptor-ref name="fileUpload"/>-->
17                 <result>/WEB-INF/page/common/success.jsp</result>
18              </action>
19 
20      </package>

  

  不建议在struts.properties文件直接修改struts的配置。

  建议在struts.xml中以类似 <constant name="struts.multipart.maxSize" value="10000000"/>的形式进行配置修改。

  

  上传页面要注意 method="post" enctype="multipart/form-data"

  

 1 <form action="uploadFile.action" method="post" enctype="multipart/form-data">                    
 2     <table cellspacing="0" cellpadding="0">
 3         <tr>
 4             <td>
 5                 <input  type="file" name="file" size="50" contentEditable="false" onChange="checkFile(this.value)">
 6             </td>
 7         </tr>
 8         <tr>
 9             <td>
10                 <input type="submit" value="上传">
11             </td>
12         </tr>
13     </table>
14 </form>