1 public class UploadServlet extendsHttpServlet {2
3 public voiddoGet(HttpServletRequest request, HttpServletResponse response)4 throwsServletException, IOException {5
6 List types = Arrays.asList("jpg","gif","avi","txt");7
8 try{9 DiskFileItemFactory factory = new DiskFileItemFactory(); //10k
10 factory.setSizeThreshold(1024*1024);11 factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));12
13 ServletFileUpload upload = newServletFileUpload(factory);14 upload.setProgressListener(newProgressListener(){15 public void update(long pBytesRead, long pContentLength, intpItems) {16 System.out.println("当前已解析:" +pBytesRead);17 }18 });19
20 upload.setFileSizeMax(1024*1024*5);21 if(!upload.isMultipartContent(request)){22 //按照传统方式获取表单数据
23 request.getParameter("username");24 return;25 }26 upload.setHeaderEncoding("UTF-8");27
28 //把文件解析到一个list集合
29 List list =upload.parseRequest(request);30
31 for(FileItem item : list){32 if(item.isFormField()){33 //为普通输入项
34 String inputName =item.getFieldName();35 String inputValue = item.getString("UTF-8");36 //inputValue = new String(inputValue.getBytes("iso8859-1"),"UTF-8");
37 System.out.println(inputName + "=" +inputValue);38 }else{39
40 String filename = item.getName().substring(item.getName().lastIndexOf("\\")+1); //""41
42 //判断是否为空文件,如果为空跳至下一次循环
43 if(filename==null || filename.trim().equals("")){44 continue;45 }46
47
48 //限制上传文件的类型
49 /*String ext = filename.substring(filename.lastIndexOf(".")+1);50 if(!types.contains(ext)){51 request.setAttribute("message", "本系统不支持" + ext + "这种类型");52 request.getRequestDispatcher("/message.jsp").forward(request, response);53 return;54 }*/
55 InputStream in =item.getInputStream();56 int len = 0;57 byte buffer[] = new byte[1024];58 String saveFileName =generateFileName(filename);59 String savepath = generateSavePath(this.getServletContext().getRealPath("/WEB-INF/upload"),saveFileName);60 FileOutputStream out = new FileOutputStream(savepath + File.separator +saveFileName);61 while((len=in.read(buffer))>0){62 out.write(buffer, 0, len);63 }64 in.close();65 out.close();66 item.delete(); //删除临时文件,必须删除
67 }68 }69 }catch(FileUploadBase.FileSizeLimitExceededException e) {70
71 //如果限制了上传文件的大小、必须捕捉这个异常
72 request.setAttribute("message", "文件大小不能超过5m");73 request.getRequestDispatcher("/message.jsp").forward(request, response);74 return;75 }catch(Exception e) {76 throw newRuntimeException(e);77 }78
79 //上传成功、跳转全局消息显示页面
80 request.setAttribute("message", "上传成功!!");81 request.getRequestDispatcher("/message.jsp").forward(request, response);82 }83
84
85
86 //生成目录、文件不能全部保存同一个目录、要打散保存在不同的目录
87 publicString generateSavePath(String path,String filename){88
89 //得到文件名在内存中的哈希值,在内存中是32位二进制
90 int hashcode = filename.hashCode(); //12122191
92 //低四位与上15得到一级目录
93 int dir1 = hashcode&15;94
95 //右移4位再与上15得到二级目录
96 int dir2 = (hashcode>>4)&0xf;97
98 String savepath = path + File.separator + dir1 + File.separator +dir2;99
100 //判断目录是否存在、不存在就创建
101 File file = newFile(savepath);102 if(!file.exists()){103 file.mkdirs();104 }105 returnsavepath;106 }107
108
109 //生成唯一的文件名、防止同名文件被覆盖
110 publicString generateFileName(String filename){111 //83434-83u483-934934
112 return UUID.randomUUID().toString() + "_" +filename;113 }114
115 public voiddoPost(HttpServletRequest request, HttpServletResponse response)116 throwsServletException, IOException {117 doGet(request, response);118 }119
120 }