在<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>集合都可以。
针对以上是网上查询整理分析的,接下来我要说的是,实战中发现的问题,避免减少弯路:<constant name="struts.multipart.maxSize" value="104857600" />
<!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
<constant name="struts.multipart.saveDir " value="d:/tmp" />
<interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型 -->
<param name="allowedTypes">application/vnd.ms-excel</param>
<!-- 配置允许上传的文件大小 单位字节-->
<param name="maximumSize">5242880</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>