1 import java.io.File; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.List; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import org.apache.commons.fileupload.FileItem; 11 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 12 import org.apache.commons.fileupload.servlet.ServletFileUpload; 13 14 public class UploadHandleServlet extends HttpServlet { 15 16 public void doGet(HttpServletRequest request, HttpServletResponse response) 17 throws ServletException, IOException { 18 //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全 19 String savePath = this.getServletContext().getRealPath("/WEB-INF/upload"); 20 File file = new File(savePath); 21 //判断上传文件的保存目录是否存在 22 if (!file.exists() && !file.isDirectory()) { 23 System.out.println(savePath+"目录不存在,需要创建"); 24 //创建目录 25 file.mkdir(); 26 } 27 //消息提示 28 String message = ""; 29 try{ 30 //使用Apache文件上传组件处理文件上传步骤: 31 //1、创建一个DiskFileItemFactory工厂 32 DiskFileItemFactory factory = new DiskFileItemFactory(); 33 //2、创建一个文件上传解析器 34 ServletFileUpload upload = new ServletFileUpload(factory); 35 //解决上传文件名的中文乱码 36 upload.setHeaderEncoding("UTF-8"); 37 //3、判断提交上来的数据是否是上传表单的数据 38 if(!ServletFileUpload.isMultipartContent(request)){ 39 //按照传统方式获取数据 40 return; 41 } 42 //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 43 List<FileItem> list = upload.parseRequest(request); 44 for(FileItem item : list){ 45 //如果fileitem中封装的是普通输入项的数据 46 if(item.isFormField()){ 47 String name = item.getFieldName(); 48 //解决普通输入项的数据的中文乱码问题 49 String value = item.getString("UTF-8"); 50 //value = new String(value.getBytes("iso8859-1"),"UTF-8"); 51 System.out.println(name + "=" + value); 52 }else{//如果fileitem中封装的是上传文件 53 //得到上传的文件名称, 54 String filename = item.getName(); 55 System.out.println(filename); 56 if(filename==null || filename.trim().equals("")){ 57 continue; 58 } 59 //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt 60 //处理获取到的上传文件的文件名的路径部分,只保留文件名部分 61 filename = filename.substring(filename.lastIndexOf("\\")+1); 62 //获取item中的上传文件的输入流 63 InputStream in = item.getInputStream(); 64 //创建一个文件输出流 65 FileOutputStream out = new FileOutputStream(savePath + "\\" + filename); 66 //创建一个缓冲区 67 byte buffer[] = new byte[1024]; 68 //判断输入流中的数据是否已经读完的标识 69 int len = 0; 70 //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据 71 while((len=in.read(buffer))>0){ 72 //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中 73 out.write(buffer, 0, len); 74 } 75 //关闭输入流 76 in.close(); 77 //关闭输出流 78 out.close(); 79 //删除处理文件上传时生成的临时文件 80 item.delete(); 81 message = "文件上传成功!"; 82 } 83 } 84 }catch (Exception e) { 85 message= "文件上传失败!"; 86 e.printStackTrace(); 87 88 } 89 request.setAttribute("message",message); 90 request.getRequestDispatcher("/message.jsp").forward(request, response); 91 } 92 93 public void doPost(HttpServletRequest request, HttpServletResponse response) 94 throws ServletException, IOException { 95 96 doGet(request, response); 97 } 98 }
时间: 2024-11-07 08:35:33