1 import java.util.*;
2 import java.lang.*;
3 import java.io.File;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import javax.servlet.http.HttpServletRequest;
8 import org.apache.commons.fileupload.FileItem;
9 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
10 import org.apache.commons.fileupload.servlet.ServletFileUpload;
11 class FileUpload{
12 //允许上传的文件类型们
13 private String[] fileTypes = null;
14 //上传文件保存路径
15 private String savapath = null;
16 //允许上传文件的最大值
17 private long fileSizeMax=10*1024*1024;
18 //缓存路径
19 private String cachePath=null;
20 //最大缓存值
21 int cacheSizeMax = 5*1024*1024;
22 //表单中的文本文件用Map保存
23 private Map<String,String> textcontent;
24 private ServletFileUpload servletFileUpload;
25 //定义文件工厂
26 private DiskFileItemFactory factory=new DiskFileItemFactory();
27 //定义构造方法
28 public FileUpload(){}
29
30 public FileUpload(String[] fileTypes,String savapath,long fileSizeMax,String cachePath,int cacheSizeMax){
31 super();
32 this.fileTypes = fileTypes;
33 this.savapath = savapath;
34 this.fileSizeMax = fileSizeMax;
35 this.cachePath = cachePath;
36 this.cacheSizeMax = cacheSizeMax;
37 }
38
39 public FileUpload(String[] fileTypes,String savapath,String cachePath,){
40 super();
41 this.fileTypes = fileTypes;
42 this.savapath = savapath;
43 this.cachePath = cachePath;
44 }
45 public void setCachePath(String cachePath){
46 this.cachePath=cachePath;
47 }
48 public void setCacheSize(int size){
49 this.cacheSizeMax=size;
50 }
51 public void setDstPath(String path){
52 this.savaPath=path;
53 }
54 public void setFileSize(long size){
55 this.fileSizeMax=size;
56 }
57 public void setFileType(String[] types){
58 this.fileTypes=types;
59 }
60 //获取文件后缀名
61 public String getFileExt(File file){
62 String path=file.getName();
63 return path.substring(path.lastIndexOf(".")+1);
64 }
65
66 //获取文本文件
67 public Map<String,String> getTextContent(){
68 return textcontent;
69 }
70
71 //把提取到的文本内容们赋给类本身的map对象,以供外界取用
72 public void setTextContent(Map<String,String> map){
73 this.textcontent=map;
74 }
75 public ServletFileUpload getServletFileUpload(){
76 if(servletFileUpload==null){
77 servletFileUpload=new ServletFileUpload(factory);
78 return servletFileUpload;
79 }else{
80 return servletFileUpload;
81 }
82 }
83 //判断文件是否为合法的类型
84 public boolean isFileValidate(File file){
85 if(fileTypes==null){return true;}
86 for(int i=0;i<fileTypes.length;++i){
87 if(fileTypes[i].equals(getFileExt(file))){
88 return true;
89 }
90 }
91 return false;
92 }
93 //创建文件目录:用于后面根据路径来创建文件保存目录、缓存目录
94 public void makeDir(String url){
95 File file=new File(url);
96 if(!file.exists()){
97 if(!file.mkdirs()){
98 System.out.println("fail to create dir!");
99 }
100 }
101 }
102 //上传方法
103 public void upload(HttpServletRequest request){
104
105 try{
106 if(!ServletFileUpload.isMultipartContent(request)){
107 return;
108 }
109 makeDir(dstPath);//创建文件保存目录
110 makeDir(cachePath); //创建缓存目录
111 factory.setRepository(new File(cachePath));//设置缓存路径
112 factory.setSizeThreshold(cacheSizeMax);//设置缓存大小
113 ServletFileUpload sfu=getServletFileUpload();//获取上传类
114 sfu.setFileSizeMax(fileSizeMax);//设置上传文件允许的最大值
115
116
117 List<FileItem> items=sfu.parseRequest(request);//提取请求中附带的文件们
118 Map<String,String> map =new HashMap<String,String>();//创建一个map对象来提取上传表单中的文本内容
119
120 //迭代提取上传的文件们
121 Iterator it=items.iterator();
122 while(it.hasNext()){
123 FileItem fileItem=(FileItem)it.next();
124 if(fileItem.isFormField()){//如果是文本内容,则提取出来放进map里
125 map.put(fileItem.getFieldName(),fileItem.getString("UTF-8"));
126 }else{//如果不是文本,则为文件
127 String path=fileItem.getName();//获取文件名
128 long size=fileItem.getSize();//获取文件大小
129 if ("".equals(path) || size == 0) {//无效文件的判断
130 System.out.println("not validate file");
131 return;
132 }
133
134 File file=new File(dstPath,new File(fileItem.getName()).getName());//根据文件名在文件保存路径下创建一个同名文件
135 if(!isFileValidate(file)){//判断文件类型是否合法
136 System.out.println("file type incorrect!");
137 }else{
138 fileItem.write(file);//文件合法,则通过IO流把上传文件写到文件路径下
139
140 }
141 }
142 }
143 setTextContent(map);//表单文本内容提取完毕,把map中的内容set给类中的textContent对象。
144 }catch(Exception ex){
145 System.out.println(ex);
146 }
147 }
148 }