图片上传类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }