struts2上传文件

来源:互联网 发布:西电网络信息安全学院 编辑:程序博客网 时间:2024/06/15 23:11
Strut2的Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性 无法获取上传文件的文件名和文件类型,所以Struts2就直接将文件域中包含的上传文件名和文件类型的信息封装到uploadFileName和 uploadContentType属性中,也就是说Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
l 类型为File的xxx属性:用来封装页面文件域对应的文件内容。
2 类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。
3 类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。
Struts2自带了文件上传拦截器方便进行文件上传,要使用这个功能,必须给使用了Struts2框架的工程添加commons.io包,然后在struts.xml里进行以下设置:

在<package>标签之外添加<constant name="struts.multipart.saveDir" val ="/temp"/>,这句指定了上传文件的临时存放目录,以这句为例,临时存放目录为应用所在根目录下的temp文件夹,假设我的应用放在D:\Program Files\apache-tomcat-6.0.24\webapps下,那么临时存放目录就是D:\temp。也可以指定一个绝对路径。目录不存在也没关系,会自动创建。

那么如何实现?

1. 单文件上传:

首先来一个最简单的用法,即一次上传一个文件,参数都使用默认值。

只需要写一个前端:

  <form action="uploadAction" method="post" enctype="multipart/form-data">      <input type="file" name="file"/><br/>      <input type="submit" value="上传" />  </form>

  然后定义Action:

复制代码
 1 public class UploadAction extends ActionSupport { 2  3     private File file; //与表单file控件的name一致,指向了服务器临时目录中的上传文件 4     private String fileContentType; //File变量的名+ContentType,表示文件的MIME类型 5     private String fileFileName; //File变量的名+FileName,表示文件上传之前的名称 6  7     @Override 8     public String execute() throws Exception { 9         10         System.out.println(file+" "+fileContentType+" "+fileFileName);11         12         //do something...13         14         return SUCCESS;15     }16 17     public File getFile() {18         return file;19     }20 21     public void setFile(File file) {22         this.file = file;23     }24 25     public String getFileContentType() {26         return fileContentType;27     }28 29     public void setFileContentType(String fileContentType) {30         this.fileContentType = fileContentType;31     }32 33     public String getFileFileName() {34         return fileFileName;35     }36 37     public void setFileFileName(String fileFileName) {38         this.fileFileName = fileFileName;39     }40 41 }
复制代码

 Action中的三个变量:

File file : 对于单文件上传类型,这个文件的名字必须是File类型的并且变量的名字要和前端表单的文件控件的name属性一致,会给这个变量赋值指向处于服务器上传文件临时目录中的那个文件。

fileContentType :文件的MIME类型,比如image/jpeg,application/octet-stream之类的。

fileFileName : 文件名,文件在上传之前在客户端的磁盘上存在就必然有一个名字,这里就是那个名字。

总结一下单文件上传:

1.表单的enctype="multipart/form-data"属性。

2.Action的三个成员变量file(文件本身),fileContentType(文件MIME类型),fileFileName(文件名)。

2. 多文件上传

  <form action="uploadAction" method="post" enctype="multipart/form-data">      <input type="file" name="file"/><br/>      <input type="file" name="file"/><br/>      <input type="submit" value="上传" />  </form>

 Action:

复制代码
 1 public class UploadAction extends ActionSupport { 2  3     private File file[]; // 与表单file控件的name一致,指向了服务器临时目录中的上传文件 4     private String fileContentType[]; // File变量的名+ContentType,表示文件的MIME类型 5     private String fileFileName[]; // File变量的名+FileName,表示文件上传之前的名称 6  7     @Override 8     public String execute() throws Exception { 9 10         for(int i=0;i<file.length;i++){11             System.out.println(file[i]+" "+fileContentType[i]+" "+fileFileName[i]);12         }13         14         // do something...15 16         return SUCCESS;17     }18 19     public File[] getFile() {20         return file;21     }22 23     public void setFile(File[] file) {24         this.file = file;25     }26 27     public String[] getFileContentType() {28         return fileContentType;29     }30 31     public void setFileContentType(String[] fileContentType) {32         this.fileContentType = fileContentType;33     }34 35     public String[] getFileFileName() {36         return fileFileName;37     }38 39     public void setFileFileName(String[] fileFileName) {40         this.fileFileName = fileFileName;41     }42 43 }
复制代码

 或者:

复制代码
 1 public class UploadAction extends ActionSupport { 2  3     private List<File> file; // 与表单file控件的name一致,指向了服务器临时目录中的上传文件 4     private List<String> fileContentType; // File变量的名+ContentType,表示文件的MIME类型 5     private List<String> fileFileName; // File变量的名+FileName,表示文件上传之前的名称 6  7     @Override 8     public String execute() throws Exception { 9 10         for (int i = 0; i < file.size(); i++) {11             System.out.println(file.get(i) + " " + fileContentType.get(i) + " "12                     + fileFileName.get(i));13         }14 15         // do something...16 17         return SUCCESS;18     }19 20     public List<File> getFile() {21         return file;22     }23 24     public void setFile(List<File> file) {25         this.file = file;26     }27 28     public List<String> getFileContentType() {29         return fileContentType;30     }31 32     public void setFileContentType(List<String> fileContentType) {33         this.fileContentType = fileContentType;34     }35 36     public List<String> getFileFileName() {37         return fileFileName;38     }39 40     public void setFileFileName(List<String> fileFileName) {41         this.fileFileName = fileFileName;42     }43 44 }
复制代码

 多文件上传的要点就是在单文件上传的基础上前端多个名字相同的表单文件域,Action接收的地方改成File[]数组或者List<File>集合都可以。

针对以上是网上查询整理分析的,接下来我要说的是,实战中发现的问题,避免减少弯路:
在开发的时候,我发现只要在struts2.xml配置文件中加上:
<!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
<constant name="struts.multipart.maxSize" value="104857600" />
<!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
<constant name="struts.multipart.saveDir " value="d:/tmp" />
之后在其他xml配置文件进行文件上传action配置的时候,是不需要在进行配置文件上传拦截器,只要你导入该有的jar包,系统自己会自动拦截并识别,当然如果你限制上传的类型,那你就可以选择以下(不是必需的,这在很多开发过程中,很多人会搞混淆,认为是一定要的,其实不然):
 <!-- 配置fileUpload的拦截器 -->
<interceptor-ref name="fileUpload">
 <!-- 配置允许上传的文件类型 -->
<param name="allowedTypes">application/vnd.ms-excel</param>
 <!-- 配置允许上传的文件大小 单位字节-->
<param name="maximumSize">5242880</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
以上就是对文件上传的一个总结分析!
原创粉丝点击