zoukankan      html  css  js  c++  java
  • 《Spring实战》读书笔记--SpringMVC处理Multipart数据

    《Spring实战》读书笔记--SpringMVC处理Multipart数据

    1.Multipart介绍


    1.1 Multipart形式的数据
    Multipart格式数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域。在一般的表单输入域中,它对应的部分会放置文本型数据,如果是文件上传形式,它对应的部分可以是二进制。
    1.2 Multipart/form-data请求方式
    Multipart/form-data是建立在HTTP的POST请求方式以上的请求,其一般用于HTTP文件上传。
    所以我们需要在表单(form)元素中如下设置,使得该表单请求用于处理文件:

    1 <form class="" action="" method="post" enctype="multipart/form-data">

    2.SpringMVC处理Multipart数据


    2.1 配置Multipart解析器
    DispatcherServlet没有实现解析multipart请求数据的功能。它将任务委托给Spring中MutipartResolver策略接口实现,通过这个实现类来解析multipart请求中的内容。Spring3.1后内置两个MultipartResolver的实现供我们选择:

    • CommonsMultipartResolver: 使用Jakarta Commons FileUpload解析multipart请求。
    • StandardServletMultipartResolver: 依赖于Servlet3.0对multipart请求的支持。

    一.使用CommonsMultipartResolver解析器
    因为CommonsMultipartResolver依赖于Apache Commons FileUpload,所以我们需要引入commons-fileupload

    1 <dependency>
    2     <groupId>commons-fileupload</groupId>
    3     <artifactId>commons-fileupload</artifactId>
    4     <version>1.3.1</version>
    5 </dependency>

    在SpringMVC配置文件中装载Bean即可,通过注入相关属性设置参数。

    1 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    2     <property name="defaultEncoding" value="utf-8" /> 
    3     <property name="maxUploadSize" value="1024000" />
    4     <property name="maxInMemorySize" value="204800" />
    5     <property name="uploadTempDir" value="/" />
    6 </bean>

    相关属性说明

    属性名说明
    defaultEncoding 默认的解析编码,默认为iso-8859-1
    maxUploaadSize 上传文件的最大大小,默认为-1(无限制)
    maxInMemorySize 内存缓冲区大小,超过时写入硬盘,默认为-1(无限制)
    uploadTempDir  临时文件目录,默认是serlvet容器的临时目录

    二.使用StandardServletMultipartResolver解析器
    在SpringMVC配置文件中装载Bean

    1 <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">

    因为StandardServletMultipartResolver解析使用Servlet的处理Multipart方法处理,所以我们需要在web.xml中设置DispatcherServlet时设置相关属性

     1 <servlet>
     2     <servlet-name>useSpringMVC-dispatcher</servlet-name>
     3     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     4     <init-param>
     5         <param-name>contextConfigLocation</param-name>
     6         <param-value>classpath:spring/spring-*.xml</param-value>
     7     </init-param>
     8     <load-on-startup>1</load-on-startup>
     9     <multipart-config>
    10         <location>/</location>
    11         <max-file-size>102400</max-file-size>
    12         <max-request-size>204800</max-request-size>
    13         </multipart-config>
    14 </servlet>

    相关属性说明

    属性名说明
    location 上传文件所存放的临时目录。必须指定
    max-file-size 文件的最大大小,单位为字节。默认没有限制
    max-request-size 请求的最大大小,单位为字节。默认没有限制)
    file-size-threshold  文件大小阈值,当大于这个阈值时将写入到磁盘,否则在内存中。默认值为0

    2.2 处理multipart请求
    一.Spring提供了MutilpartFile接口处理Mutilpart数据。接口API如下:

     1 public interface MultipartFile {
     2     /**
     3     * 返回表单中mutilpart数据的名字
     4     */
     5     String getName();
     6     /**
     7     * 返回该文件名
     8     */
     9     String getOriginalFilename();
    10     
    11 
    12     boolean isEmpty();
    13     
    14 
    15     byte[] getBytes() throws IOException;
    16     
    17     InputStream getInputStream() throws IOException;
    18     /**
    19     * 把MultipartFile接口对象转换为File对象
    20     */
    21     void transferTo(File dest) throws IOException, IllegalStateException;
    22 }

    二.控制器处理multipart请求

     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 lang="zh-cn">
     5 <head>
     6 <meta charset="UTF-8">
     7 <meta name="viewport" content="width=device-width, initial-scale=1.0">
     8 <meta http-equiv="X-UA-Compatible" content="IE=edge">
     9 <link rel="stylesheet"
    10     href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
    11 <title>File Upload</title>
    12 </head>
    13 <body>
    14     <div class="container">
    15         <div style="padding-top: 200px"></div>
    16         <div class="row">
    17             <div class="col-md-4"></div>
    18             <div class="col-md-5">
    19                 <div class="panel panel-default" >
    20                     <div class="panel-heading text-center">
    21                         <h2>文件上传</h2> 
    22                     </div>
    23                     <div class="panel-body">
    24                         <form class="form-horizontal" role="form" action="/springMVC/upload" method="post" enctype="multipart/form-data">
    25                             <div class="form-group">
    26                                 <label class="col-sm-3 text-center">文 件</label>
    27                                 <div class="col-sm-7">
    28                                     <input type="file" id="exampleInputFile" name="file">
    29                                 </div>
    30                                 <div class="col-sm-2"></div>
    31                             </div>
    32                             <div class="form-group">
    33                                 <div class="col-sm-12" style="padding-top:10px">
    34                                     <button type="submit" class="btn btn-primary col-sm-12">上 传</button>
    35                                 </div>
    36                             </div>
    37                         </form>
    38                     </div>
    39                 </div>
    40             </div>
    41             <div class="col-md-3"></div>
    42         </div>
    43     </div>
    44     <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    45     <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
    46 </body>
    47 </html>

    controller代码

    1 @RequestMapping(value="/upload", method=RequestMethod.POST)
    2 public String fileUpload(@RequestPart(value="file") MultipartFile multipartFile){
    3     //处理逻辑
    4     String path = "E:/java/fileupload/" + file.getOriginalFilename();
    5     multipartFile.transferTo(new File(path));    
    6 }

    三.多文件上传
    多文件上传只需要把html代码中的< input name=".." >name属性设置为一样的就好。然后在controller中使用MultipartFile数组接受就行。

    1 @RequestMapping(value="/upload", method=RequestMethod.POST)
    2 public String fileUpload(@RequestPart(value="file") MultipartFile[] multipartFiles){
    3     //处理逻辑
    4 }

    3.References

    https://my.oschina.net/cnlw/blog/168466

  • 相关阅读:
    springboot新手脱坑之无法下载依赖包
    07_mybatis延迟加载
    05_mybatis动态sql
    04_Mybatis输入出映射
    C#-----类FileStream的使用
    JavaWeb-----JSP详解
    JavaWeb-----ServletConfig对象和servletContext对象
    JavaWeb-----实现第一个Servlet程序
    JavaScript--浅谈!=、!==、==和===的区别
    EasyUI学习-----表格DataGrid格式化formatter用法
  • 原文地址:https://www.cnblogs.com/maying3010/p/6679974.html
Copyright © 2011-2022 走看看