1 packagecn.gs.ly;2
3 importjava.io.File;4 importjava.io.FileOutputStream;5 importjava.io.IOException;6 importjava.io.InputStream;7 importjava.io.OutputStream;8 importjava.util.List;9
10 importjavax.servlet.ServletException;11 importjavax.servlet.http.HttpServlet;12 importjavax.servlet.http.HttpServletRequest;13 importjavax.servlet.http.HttpServletResponse;14
15 importorg.apache.commons.fileupload.FileItem;16 importorg.apache.commons.fileupload.FileUploadException;17 importorg.apache.commons.fileupload.ProgressListener;18 importorg.apache.commons.fileupload.disk.DiskFileItemFactory;19 importorg.apache.commons.fileupload.servlet.ServletFileUpload;20
21
22 public class FileUploadServlet extendsHttpServlet {23 @Override24 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {25 try{26 //得到上传文件的保存目录。 将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
27 String realPath = this.getServletContext().getRealPath("/upload");///WEB-INF/files
28 System.out.println("文件存放位置:"+realPath);29 //设置临时目录。 上传文件大于缓冲区则先放于临时目录中
30 String tempPath = "E:\\tempPath";31 System.out.println("临时文件存放位置:"+tempPath);32
33
34 //判断存放上传文件的目录是否存在(不存在则创建)
35 File f = newFile(realPath);36 if(!f.exists()&&!f.isDirectory()){37 System.out.println("目录或文件不存在! 创建目标目录。");38 f.mkdir();39 }40 //判断临时目录是否存在(不存在则创建)
41 File f1 = newFile(tempPath);42 if(!f1.isDirectory()){43 System.out.println("临时文件目录不存在! 创建临时文件目录");44 f1.mkdir();45 }46
47 /**
48 * 使用Apache文件上传组件处理文件上传步骤:49 *50 **/
51 //1、设置环境:创建一个DiskFileItemFactory工厂
52 DiskFileItemFactory factory = newDiskFileItemFactory();53
54 //设置上传文件的临时目录
55 factory.setRepository(f1);56
57 //2、核心操作类:创建一个文件上传解析器。
58 ServletFileUpload upload = newServletFileUpload(factory);59 //解决上传"文件名"的中文乱码
60 upload.setHeaderEncoding("UTF-8");61
62 //3、判断enctype:判断提交上来的数据是否是上传表单的数据
63 if(!ServletFileUpload.isMultipartContent(req)){64 System.out.println("不是上传文件,终止");65 //按照传统方式获取数据
66 return;67 }68
69 //==获取输入项==70 // //限制单个上传文件大小(5M)71 //upload.setFileSizeMax(1024*1024*4);72 // //限制总上传文件大小(10M)73 //upload.setSizeMax(1024*1024*6);74
75 //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List集合,每一个FileItem对应一个Form表单的输入项
76 List items =upload.parseRequest(req);77 for(FileItem item:items){78 //如果fileitem中封装的是普通输入项的数据(输出名、值)
79 if(item.isFormField()){80 String filedName = item.getFieldName();//普通输入项数据的名81 //解决普通输入项的数据的中文乱码问题
82 String filedValue = item.getString("UTF-8");//普通输入项的值
83 System.out.println("普通字段:"+filedName+"=="+filedValue);84 }else{85 //如果fileitem中封装的是上传文件,得到上传的文件名称,
86 String fileName = item.getName();//上传文件的名87 //多个文件上传输入框有空 的 异常处理
88 if(fileName==null||"".equals(fileName.trim())){ //去空格是否为空
89 continue;//为空,跳过当次循环, 第一个没输入则跳过可以继续输入第二个
90 }91
92 //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt93 //处理上传文件的文件名的路径,截取字符串只保留文件名部分。//截取留最后一个"\"之后,+1截取向右移一位("\a.txt"-->"a.txt")
94 fileName = fileName.substring(fileName.lastIndexOf("\\")+1);95 //拼接上传路径。存放路径+上传的文件名
96 String filePath = realPath+"\\"+fileName;97 //构建输入输出流
98 InputStream in = item.getInputStream(); //获取item中的上传文件的输入流
99 OutputStream out = new FileOutputStream(filePath); //创建一个文件输出流100
101 //创建一个缓冲区
102 byte b[] = new byte[1024];103 //判断输入流中的数据是否已经读完的标识
104 int len = -1;105 //循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据
106 while((len=in.read(b))!=-1){ //没数据了返回-1107 //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
108 out.write(b, 0, len);109 }110 //关闭流
111 out.close();112 in.close();113 //删除临时文件
114 try{115 Thread.sleep(3000);116 } catch(InterruptedException e) {117 e.printStackTrace();118 }119 item.delete();//删除处理文件上传时生成的临时文件
120 System.out.println("文件上传成功");121 }122 }123 } catch(FileUploadException e) {124 //e.printStackTrace();
125 throw new RuntimeException("服务器繁忙,文件上传失败");126 }127 }128
129 @Override130 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {131 this.doPost(req, resp);132 }