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包

 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()

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

posted @ 2021-06-02 11:50  笺笙  阅读(246)  评论(0编辑  收藏  举报