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.jsptitle>
 8 head>
 9 <body>
10     
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+"
"); 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+"
"); 43 out.println("上传文件的大小:" + part.getSize()+"
"); 44 if (!fileName.equals(null)) { 45 //上传到服务器的uploadFiles目录中 46 part.write(uploadFileDir+File.separator+fileName); 47 } 48 out.println("文件上传到:"+uploadFileDir+File.separator+fileName+"
"); 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 
 4 
 5 
 6 
 7 文件上传
 8 
 9 
10     
11 121314171819202324252829
上传者 15 16
上传文件 21 22
26 27
30
31 32

  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 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+"
"); 75 } 76 } 77 }else { 78 //获取上传的文件名 79 String fileName = fileItem.getName(); 80 if (fileName != null && !fileName.equals("")) { 81 writer.print("上传的文件名称是:"+fileName+"
"); 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("上传文件成功!
"); 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()

返回上传文件的大小(以字节为单位)