文件的上传(照片上传)

JAVA学习网 2017-08-19 00:00:04

1.文件的上传
   [1] 简介
      > 将一个客户端的本地的文件发送到服务器中保存。
       > 上传文件是通过流的形式将文件发送给服务器。
 
   [2] 表单的设置
      > 向服务器上传一个文件时,表单要使用post请求。
      > 表单的默认属性enctype="application/x-www-form-urlencoded"
       - 这个属性的意思是请求体中的内容将会使用URL编码
      > 上传文件的表单enctype需要设置为 multipart/form-data
     - multipart/form-data表示的是表单是一个多部件的表单
     - 如果类型设置为它,则我们的每一个表单项都会作为一个单独的部件发送给服务器。
     - 多个部件之间使用类似 -----------------------------7df2d08c0892 分割符来分开
     > 当表单设置为multipart/form-data时,我们request.getParameter()将失效,我们不能再通过该方法获取请求参数。

   [3] FileUpload
     > 我们一般情况下使用commons-fileupload-1.3.1.jar这个工具来解析多部件请求。
     > fileupload 依赖 commons-io 所以我们要是Filtupload需要同时导入io包。
     > 核心类:
   DiskFileItemFactory
    - 工厂类,用于构建一个解析器实例。
    
   ServletFileUpload
    - 解析器类,通过该类实例来解析request中的请求信息。
    
   FileItem
    - 工具会将我们请求中每一个部件,都封装为一个FileItem对象,处理文件上传时,只需要调用该对象的方法
    - 方法:
     boolean isFormField()  --> 当前表单项是否是一个普通表单项,true是普通表单项, false是文件表单项
     String getContentType() --> 返回的是文件的类型,是MIME值
     String getFieldName()   --> 获取表单项的name属性值
     String getName()   --> 获取上传的文件的名字
     long getSize()          --> 获取文件的大小
     String getString(String encoding) --> 获取表单项的value属性值,需要接受一个编码作为参数。
     void write(File file)    --> 将表单项中的内容写入到磁盘中
    
  > 使用步骤:
   1.获取工厂类实例[DiskFileItemFactory]
   2.获取解析器类实例[ServletFileUpload]
   3.解析request获取FileItem[parseRequest()]

[4] 细节
  第一个问题
  > 部分浏览器会将文件的完整路径作为文件名发送。
   C:\Users\lilichao\Desktop\day20\图片\蒙娜丽莎.jpg
  > 像这类文件名我们需要截取一下字符串,只获取名字这部分,而不需要获取路径部分的信息。
   通过如下代码对文件名进行截取字符串的操作:
    if(name.contains("\\")){
     //如果包含则截取字符串
     name = name.substring(name.lastIndexOf("\\")+1);
    }
    
  第二个问题
  > 上传的文件有可能出现重名,后上传的文件会将先上传的文件覆盖。
  > 解决:给文件名加一个唯一的前缀。
    唯一标识_fennu.jpg
    UUID_fennu.jpg
  
  第三个问题
  > 有些情况需要限制上传文件的大小。
   - 设置单个文件大小为50KB:
    fileUpload.setFileSizeMax(1024*50);
   - 设置完单个文件大小限制以后,一旦上传的文件超过限制,则会抛出如下异常:
    FileSizeLimitExceededException
    所有可以对该异常进行捕获,当出现该异常时则设置一个错误消息。
   
   - 设置多个文件的总大小为150KB
    fileUpload.setSizeMax(1024*150);
   - 当多个文件的大小超出范围时,会抛出如下异常
    SizeLimitExceededException
    
  第四个问题
   > 当用户上传一个空的文件,依然会将文件保存到硬盘上。
   > 在保存文件应该先对文件的大小进行判断,如果size为0,则不处理。

 

下面是代码实现部分:

  Servlet里面的内容:

 1 package com.neuedu.servlet;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.util.List;
 6 import java.util.UUID;
 7 
 8 import javax.servlet.ServletContext;
 9 import javax.servlet.ServletException;
10 import javax.servlet.annotation.WebServlet;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 
15 import org.apache.commons.fileupload.FileItem;
16 import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
17 import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
18 import org.apache.commons.fileupload.FileUploadException;
19 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
20 import org.apache.commons.fileupload.servlet.ServletFileUpload;
21 
22 
23 
24 
25 
26 @WebServlet("/FileUploadServlet")
27 public class FileUploadServlet extends HttpServlet {
28     private static final long serialVersionUID = 1L;
29        
30 
31 
32     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
33         //1.创建工厂类
34         DiskFileItemFactory factory=new DiskFileItemFactory();
35         //2.创建ServletFilUpload对象,通过这个对象完成上传功能。
36         ServletFileUpload fileUpload=new ServletFileUpload(factory);
37 //        fileUpload.setFileSizeMax(1024*50);
38         fileUpload.setSizeMax(1024*150);
39         ServletContext servletContext = request.getServletContext();
40         String realPath = servletContext.getRealPath("/upload");
41         System.out.println(realPath);
42         File file=new File(realPath);
43         if(!file.exists())
44         {
45             file.mkdirs();
46         }
47         //2.用这个fileUpload对象解析request请求
48         try {
49             List<FileItem> fileList = fileUpload.parseRequest(request);
50            for(FileItem item:fileList)
51            {
52               if(item.isFormField()){
53                   //代表普通表单项
54                   String name=item.getFieldName();
55                   String value=item.getString("utf8");
56                   System.out.println(name+":"+value);
57                   
58               }else {
59                 //代表上传的文件
60                   long size=item.getSize();
61                   if(size==0){
62                       continue;
63                   }
64                   String contentType = item.getContentType();
65                   String name = item.getName();
66                   if(name.contains("\\")){
67                       name=name.substring(name.lastIndexOf("\\")+1);
68                       
69                   }
70                   //uuid_name.jpg
71                   String prefix = UUID.randomUUID().toString();
72                   prefix=prefix.replace("-", "");
73                   String fileName=prefix+"_"+name;
74                   String fieldName=item.getFieldName();
75                   System.out.println(size+":"+contentType+":------------"+name+":"+fieldName);
76                   try {
77                     item.write(new File(realPath+"\\"+fileName));
78                 } catch (Exception e) {
79                     // TODO Auto-generated catch block
80                     e.printStackTrace();
81                 }
82                   
83             }
84            }
85         } catch (FileSizeLimitExceededException e)
86         {
87             System.out.println("文件大小不可以超过50k");
88         }
89         catch (SizeLimitExceededException e) {
90             System.out.println("文件大小不可以超过150K");
91         }
92         
93         catch (FileUploadException e) {
94             // TODO Auto-generated catch block
95             e.printStackTrace();
96         }
97     }
98 
99 }
FileUploadServlet.java

JSP里面的内容:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 <form action="${pageContext.request.contextPath}/FileUploadServlet" method="post" enctype="multipart/form-data">
11   用户名:<input type="text" name="username"/><br/>
12 <input type="file" name="photo"><br/>
13 <input type="file" name="photo1"><br/>
14 <input type="file" name="photo2"><br/>
15 <input type="submit" value="提交">
16 </form>
17 </body>
18 </html>
index.jsp

 

阅读(840) 评论(0)