1 package practice;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.UnsupportedEncodingException;
8 import java.util.List;
9 import java.util.UUID;
10
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15
16 import org.apache.commons.fileupload.FileItem;
17 import org.apache.commons.fileupload.FileUploadBase;
18 import org.apache.commons.fileupload.FileUploadException;
19 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
20 import org.apache.commons.fileupload.servlet.ServletFileUpload;
21 import org.apache.commons.io.FilenameUtils;
22
23
24
25 public class UploadServlet extends HttpServlet {
26
27 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
28 //判断表单上传的方式 是否是 multipart/form-data;
29 boolean ismultipartContent = ServletFileUpload.isMultipartContent(request);
30 if(!ismultipartContent){
31 throw new RuntimeException("your form is not multipart/form-data");
32 }
33 //创建一个DiskFileItemFactory工厂类
34 DiskFileItemFactory factory = new DiskFileItemFactory();
35 //创建一个临时文件存储的目录
36 String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
37 File tempFile = new File(tempPath);
38 if(!tempFile.exists()){
39 tempFile.mkdir();
40 }
41 factory.setRepository(tempFile);
42 //创建ServletFileUoload 核心对象
43 ServletFileUpload sfu = new ServletFileUpload(factory);
44 //解决文件上传乱码问题
45 sfu.setHeaderEncoding("utf-8");
46 try {
47 sfu.setFileSizeMax(1024*1024*3); //单个文件大小
48 sfu.setSizeMax(1024*1024*6); //总文件大小
49 //遍历表单集合返回一个List<FileItem>集合
50 List<FileItem> fileItems = sfu.parseRequest(request);
51 for(FileItem fileItem:fileItems){
52 //判断是普通表单还是上传表单
53 if(fileItem.isFormField()){
54 //按照普通表单处理
55 processFormField(fileItem);
56 }else{
57 //按照上传表单来处理
58 processUploadField(fileItem);
59 }
60 }
61 }catch(FileUploadBase.FileSizeLimitExceededException e){
62 e.printStackTrace();
63 request.setAttribute("message", "单个文件超出最大值");
64 request.getRequestDispatcher("/uploadSong.jsp").forward(request, response);
65 return;
66 }catch(FileUploadBase.SizeLimitExceededException e){
67 e.printStackTrace();
68 request.setAttribute("message", "上传文件的总大小超出限制");
69 request.getRequestDispatcher("/uploadSong.jsp").forward(request, response);
70 return;
71 }
72 catch (FileUploadException e) {
73 // TODO Auto-generated catch block
74 e.printStackTrace();
75 } //遍历表单项集合
76
77
78 }
79
80
81
82 //处理上传文件的函数
83 private void processUploadField(FileItem fileItem) {
84 //得到上传文件的名字
85 String filename = fileItem.getName();
86 //得到文件输入流
87 try {
88 InputStream is = fileItem.getInputStream();
89 //将文件保存在服务器上
90 String directoryRealPath =this.getServletContext().getRealPath("/WEB-INF/upload");//创建的路径
91 File storeDirectory = new File(directoryRealPath);
92 if(!storeDirectory.exists()){
93 storeDirectory.mkdir(); //创建一个指定目录
94 }
95 //处理文件名
96 //filename =filename.substring(filename.lastIndexOf(File.separator)+1);
97 if(filename!=null){
98 filename=FilenameUtils.getName(filename);
99 }
100 //不让文件名重复
101 filename=UUID.randomUUID()+"_"+filename;
102 //打散目录
103 String childDirectory = makChildDirectory(storeDirectory,filename);
104
105 //构建一个完整的文件路径
106 /*File file =new File(storeDirectory,childDirectory+File.separator+filename);
107 //创建一个写的流,将图片写入路径
108 FileOutputStream fos = new FileOutputStream(file);
109 int len=0;
110 byte [] buf = new byte[1024];
111 while((len=is.read(buf))!=-1){
112 fos.write(buf,0,len);
113 }
114 fos.close();
115 is.close();*/
116 //用工具类实现文件上传操作
117 fileItem.write(new File(storeDirectory,childDirectory+File.separator+filename));
118 fileItem.delete();//删除临时文件
119 } catch (Exception e) {
120 // TODO Auto-generated catch block
121 e.printStackTrace();
122 }
123 }
124
125
126 //打散目录
127 private String makChildDirectory(File storeDirectory, String filename) {
128 int hashcode = filename.hashCode();
129 //把hashcode转换成16进制
130 String code = Integer.toHexString(hashcode);
131 String childDirectory = code.charAt(0)+File.separator+code.charAt(1);
132 File file = new File(storeDirectory,childDirectory);
133 if(!file.exists()){
134 file.mkdirs();
135 }
136 return childDirectory;
137 }
138
139
140
141 //处理普通表单的函数
142 private void processFormField(FileItem fileItem) {
143 //解决文件名字乱码问题
144 try {
145 String fieldName = fileItem.getFieldName(); //获取字段名
146 //String fieldValue = fileItem.getString(); //获取值
147 String fieldValue = fileItem.getString("utf-8");
148 } catch (UnsupportedEncodingException e) {
149 // TODO Auto-generated catch block
150 e.printStackTrace();
151 }
152 }
153
154
155
156
157 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
158
159 doGet(request, response);
160 }
161
162 }