zoukankan      html  css  js  c++  java
  • 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="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()

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

  • 相关阅读:
    c语言面试
    汇编面试基础
    求余符号的用法
    ++a和a++的一点不同
    OVER子句
    SQL执行计划解析(1) 执行计划基础
    sql 排序规则 chinese_prc_ci_as
    SQL执行计划解析(2) 基本查询的图形执行计划
    过sql_trace跟踪得到了该SQL的执行计划,如何看懂执行计划
    JS日历控件集合附效果图、源代码
  • 原文地址:https://www.cnblogs.com/chaunceyji/p/14840710.html
Copyright © 2011-2022 走看看