最近学到的web阶段的文件的上传,就想记录一下,帮助自己复习以及帮助大家学习,一般我都会把上传的文件存到服务器中的web-inf 下面,因为这样用户不会直接访问到,我们存到数据库的一般都是路径。这里没有演示数据库上传路径,气势上传路径很简单,只需要你把路径和文件名插入到数据库中的某个表就可以了,等你到时候想用找到文件的时候,就从数据库中查找路径就行了。废话不说,上代码(上传文件的servlet,前台界面只需要有一个类型为file的 input标签,如果想一次选上传多个,可以多写几个input或者在input标签内 增加multiple="multiple" 属性,就可以实现一个input中写入好几个文件):
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 }