JavaWeb —— 文件上传
一、@MultipartConfig 注解实现文件上传
工具类:根据Part对象获取文件名
1 public class MyUtil { 2 public static String getFileName(Part part) { 3 if (part == null) { 4 return null; 5 } 6 //Content-Disposition: form-data; name="fieldName"; filename="filename.jpg" 7 String fileName = part.getHeader("content-disposition"); 8 //没有选择文件即文件名不存在,返回空 9 if (fileName.lastIndexOf("=")+2 == fileName.length()-1) { 10 return null; 11 } 12 //返回从头信息中获取的文件名,例:filename="filename.jpg" 13 return fileName.substring(fileName.lastIndexOf("=")+2,fileName.length()-1); 14 } 15 }
文件上传的页面显示(jsp):
1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <meta charset="utf-8"> 7 <title>uploadFileOne.jsp</title> 8 </head> 9 <body> 10 <!-- enctype="multipart/form-data":将表单中的数据变成二进制数据进行上传 --> 11 <form action="uploadFileOneServlet" method="post" enctype="multipart/form-data"> 12 <table> 13 <tr> 14 <td>文件描述:</td> 15 <td> 16 <input type="text" name="filediScription"> 17 </td> 18 </tr> 19 <tr> 20 <td>请选择文件:</td> 21 <td> 22 <input type="file" name="filePath"> 23 </td> 24 </tr> 25 <tr> 26 <td align="right"> 27 <input type="reset" value="重填"> 28 </td> 29 <td> 30 <input type="submit" value="上传"> 31 </td> 32 </tr> 33 </table> 34 </form> 35 </body> 36 </html>
上传的Servlet:
1 /** 2 * Servlet implementation class UploadFileOneServlet 3 * @description 单文件上传 4 * @author ChaunceyJi 5 */ 6 @WebServlet("/uploadFileOneServlet") 7 @MultipartConfig(maxFileSize = 10*1024*1024)//maxFileSize = 10*1024*1024:设置上传文件的最大值为10MB 8 public class UploadFileOneServlet extends HttpServlet { 9 private static final long serialVersionUID = 1L; 10 11 /** 12 * @see HttpServlet#HttpServlet() 13 */ 14 public UploadFileOneServlet() { 15 super(); 16 // TODO Auto-generated constructor stub 17 } 18 19 /** 20 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 21 */ 22 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23 // TODO Auto-generated method stub 24 //设置响应的内容的类型 25 response.setContentType("text/html;charset=utf-8"); 26 //设置请求编码 27 request.setCharacterEncoding("utf-8"); 28 //获取输出对象 29 PrintWriter out = response.getWriter(); 30 //获得Part对象 31 Part part = request.getPart("filePath"); 32 String filedScription = request.getParameter("filediScription"); 33 out.println("输入的文件描述:"+filedScription+"</br>"); 34 //指定上传的文件保存到服务器的uploadFiles目录中 35 File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles")); 36 //目录不存在就创建 37 if(!uploadFileDir.exists()) { 38 uploadFileDir.mkdirs(); 39 } 40 //获取原始文件名 41 String fileName = MyUtil.getFileName(part); 42 out.println("上传文件的原始名:"+fileName+"</br>"); 43 out.println("上传文件的大小:" + part.getSize()+"</br>"); 44 if (!fileName.equals(null)) { 45 //上传到服务器的uploadFiles目录中 46 part.write(uploadFileDir+File.separator+fileName); 47 } 48 out.println("文件上传到:"+uploadFileDir+File.separator+fileName+"</br>"); 49 } 50 51 /** 52 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 53 */ 54 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 55 // TODO Auto-generated method stub 56 doGet(request, response); 57 } 58 59 }
效果:
二、FileUpload组件实现文件的上传
1. 导入jar包
- 导入commons-fileupload.jar
- 导入commons-io.jar
- 下载地址http://commons.apache.org
2. 创建上传文件页面
1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <meta charset="utf-8"> 7 <title>文件上传</title> 8 </head> 9 <body> 10 <form action="UploadServlet" method="post" enctype="multipart/form-data"> 11 <table style="width:600px"> 12 <tr> 13 <td>上传者</td> 14 <td> 15 <input type="text" name="name"/> 16 </td> 17 </tr> 18 <tr> 19 <td>上传文件</td> 20 <td> 21 <input type="file" name="myfile"/> 22 </td> 23 </tr> 24 <tr> 25 <td colspan="2"> 26 <input type="submit" value="上传"/> 27 </td> 28 </tr> 29 </table> 30 </form> 31 </body> 32 </html>
3.文件上传Servlet
1 package com.chauncey.controller; 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.PrintWriter; 8 import java.util.List; 9 import java.util.UUID; 10 11 import javax.servlet.ServletException; 12 import javax.servlet.annotation.WebServlet; 13 import javax.servlet.http.HttpServlet; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 17 import org.apache.commons.fileupload.FileItem; 18 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 19 import org.apache.commons.fileupload.servlet.ServletFileUpload; 20 21 /** 22 * Servlet implementation class UploadServlet 23 */ 24 @WebServlet("/UploadServlet") 25 public class UploadServlet extends HttpServlet { 26 private static final long serialVersionUID = 1L; 27 28 /** 29 * @see HttpServlet#HttpServlet() 30 */ 31 public UploadServlet() { 32 super(); 33 // TODO Auto-generated constructor stub 34 } 35 36 /** 37 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 38 */ 39 @SuppressWarnings("unchecked") 40 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 41 // TODO Auto-generated method stub 42 43 try { 44 response.setContentType("text/html;charset=utf-8"); 45 //创建DiskFileItemFactory工厂对象 46 DiskFileItemFactory factory = new DiskFileItemFactory(); 47 //保存文件路径 48 String savePath = "/WEB-INF/upload/"; 49 File f = new File(savePath); 50 //判断目录是否存在,不存在就创建 51 if (!f.exists()) { 52 f.mkdirs(); 53 } 54 //设置文件缓存路径 55 factory.setRepository(f); 56 //创建ServletFileUpload对象 57 ServletFileUpload fileUpload = new ServletFileUpload(factory); 58 //设置字符编码 59 fileUpload.setHeaderEncoding("utf-8"); 60 //解析request,得到上传文件的FileItem对象 61 List<FileItem> fileItems = fileUpload.parseRequest(request); 62 //获取输出流 63 PrintWriter writer = response.getWriter(); 64 //遍历集合 65 for (FileItem fileItem : fileItems) { 66 //判断是否为普通字段 67 if (fileItem.isFormField()) { 68 //获取字段名 69 String name = fileItem.getFieldName(); 70 if (name.equals("name")) { 71 if (!fileItem.getString().equals("")) { 72 //如果文件名不为空,获取value值 73 String value = fileItem.getString("utf-8"); 74 writer.print("上传者:"+value+"<br>"); 75 } 76 } 77 }else { 78 //获取上传的文件名 79 String fileName = fileItem.getName(); 80 if (fileName != null && !fileName.equals("")) { 81 writer.print("上传的文件名称是:"+fileName+"<br>"); 82 } 83 //截取文件名 84 fileName = fileName.substring(fileName.lastIndexOf("\\")+1); 85 //文件名唯一 86 fileName = UUID.randomUUID().toString()+"_"+fileName; 87 //在服务器创建同名文件 88 String webPath = "/WEB-INF/upload/"; 89 String filePath = getServletContext().getRealPath(webPath+fileName); 90 //创建文件 91 File file = new File(filePath); 92 file.getParentFile().mkdirs(); 93 file.createNewFile(); 94 //获得上传文件流 95 InputStream in = fileItem.getInputStream(); 96 //使用FileOutputStream打开服务器端的上传文件 97 FileOutputStream out = new FileOutputStream(file); 98 byte[] buffer = new byte[1024];//每次读取一个字节 99 int len; 100 //读取上传文件的字节,并将其输出到服务器端的上传文件的输出流中 101 while((len = in.read(buffer)) > 0) { 102 out.write(buffer, 0, len); 103 in.close(); 104 out.close(); 105 //删除临时文件 106 fileItem.delete(); 107 writer.print("上传文件成功!<br/>"); 108 } 109 110 } 111 } 112 } catch (Exception e) { 113 // TODO Auto-generated catch block 114 throw new RuntimeException(e); 115 } 116 } 117 118 /** 119 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 120 */ 121 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 122 // TODO Auto-generated method stub 123 doGet(request, response); 124 } 125 126 }
效果:
FileItem接口
主要用于封装单个表单字段元素的数据,一个表单字段对应一个FileItem对象。
FileUpload组件在处理文件上传的过程中,将每个表单域(包括普通文本表单域和文本域)封装在一个FileItem对象中。
方法 |
作用 |
boolean isFormFiled() | 判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文本表单字段,如果是普通文本表单字段,则返回True,否者返回false |
String getName() | 获得文件上传的文件名。如果FileItem类对象对应的是普通文本表单字段,该方法返回null;只要 |
String getFiledName() |
获得表单字段元素请求头的name属性,也是表单标签name属性的值 |
void write(File file) |
将Fileitem对象中保存的主体内容保存到某个指定的文件中 |
String getString() |
将FileItem对象中保存的数据流内容以一个字符串返回。getString()使用默认编码将主体内容转换成字符串;getString(String encoding):使用指定编码将主体内容转换成字符串 |
String getContentType() |
获得上传文件的类型,即表单字段元素请求头属性“Content-Type”的值。若FileItem类对象对应是普通表单字段,该方法返回null |
boolean isInMemory() |
判断FileItem对象封装的数据内容是存储在内存中,还是存储在临时文件中,若存储在内存中返回true,否则返回false |
void delete() |
清空FileItem类对象中存放的主体内容,如果主体内容被保存在临时文件中,该方法将删除该临时文件 |
long getSize() |
返回上传文件的大小(以字节为单位) |