单个文件上传

spring mvc 实现文件上传需要引入两个必须的jar包

    1.所需jar包:
        
        commons-fileupload-1.3.1.jar

        commons-io-2.2.jar

    2.定义上传页面:

        定义具有上传功能的xx.jsp,其表单的设置需要注意,method属性为post,enctype属性为multipart/form-data

        <!-- 文件上传 -->
        <form action="<%=basePath%>user/upload" method="post" enctype="multipart/form-data">

            <input type="file" name="photo"/>

            <input type="submit" value="上传"/>

        </form>

    3.定义处理器:

        对于处理器的定义需要注意以下几点:

            1.用于接收表单元素所提交参数的处理器方法的形参类型不是file,而是MultipartFile。
              
              MultipartFile为一个接口,专门用于处理文件上传问题。该接口中具有很多有用的方法。

              例如:

                1.1.获取参数名称    getName()

                1.2.获取文件的原始名称    getOrinalFilename()

                1.3.获取文件大小    getSize()

                1.4.判断文件是否为空    isEmpty()

                1.5.文件上传        transferTo()

            2.未选择上传文件

                    若用户没有选择文件就直接提交了表单,此时处理器方法中的MultipartFile形参接收到的值并非null,

                而是一个emptry的文件,对于未选择文件这种情况,其判断条件是file.isEmpty(),并非file==null

            3.上传文件类型

                    spring mvc的文件上传功能并没有直接的用于限制文件上传类型的属性或方法,需要对获取到的文件的后缀名加以判断,
                
                最好的方式就是使用endsWith(".jpg")

            4.上传方法

                对于单个文件上传,直接使用MultipartFile的transferTo(file)方法,就可以完成上传功能。

                但是,该方法需要服务端用于存放文件的目录必须存在,否则会出问题

    代码:
        @RequestMapping("/upload")
        public ModelAndView doUpload(MultipartFile photo,HttpSession session) throws IllegalStateException, IOException{
        
            //判断这个文件不为空
            if(!photo.isEmpty()){
            
                //服务端的imges目录需要手动创建好
                String path = session.getServletContext().getRealPath("/Images");
            
                //获取原始文件名
                String fileName = photo.getOriginalFilename();
            
                //限制上传类型
            
                if(fileName.endsWith(".jpg")||fileName.endsWith(".png")){
                
                    File file = new File(path, fileName);

                    //完成文件上传
                    photo.transferTo(file);
                
                }else{
                
                    return new ModelAndView("/user/fail");
                }
            }
        
            return new ModelAndView("/user/success");
        
        }

    3.在spring mvc中注册文件上传处理器

        在配置文件中注册的时候需要注意:

            1.bean的名称固定:id必须为multipartResolver

            2.文件上传的字符集:默认为ISO-8859-1,可以通过defaultEncoding属性设置字符集

            3.限制文件大小:maxUploadSize属性可以用来限制文件大小,单位B,-1则表示无限制

        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

                <property name="maxUploadSize">

                        <value>100000</value>

                </property>

            <!--设置字符集--!>
                   <property name="defaultEncoding">

                        <value>UTF-8</value>

                </property>

            </bean>

多个文件上传

    前面的步骤都是一样的,唯一的区别就是处理器,下面我就给大家详解多个文件与单个文件上传的区别,以及需要注意的地方。

    @RequestMapping("/fileUpload")
    public ModelAndView fileUpload(@RequestParam MultipartFile[] photos,HttpSession session) throws IllegalStateException, IOException{
        
        //服务端的imges目录需要手动创建好
        String path = session.getServletContext().getRealPath("/Images");
        
        for (int i = 0; i < photos.length; i++) {
            if(!photos[i].isEmpty()){
                
                String fileName = photos[i].getOriginalFilename();
            
                if(fileName.endsWith(".jpg")||fileName.endsWith(".png")){
                    
                    File file = new File(path, fileName);

                    //完成文件上传
                    photos[i].transferTo(file);
                    
                }else{
                    
                    //失败返回
                    return new ModelAndView("/user/fail");
                }
            
            }
        }
        
        return new ModelAndView("/user/success");
    }

    
    需要注意的地方:

        1.处理器的形参

            用于接收表单元素所提交参数的处理器方法的形参类型为MultipartFile[]数组,并且必须使用注解@RequestParam修饰

            为什么单个文件上传时不需要@RequestParam注解修饰,而上传多个文件时就需要用@RequestParam修饰呢?

                因为在上传多个文件时,每个表单中的文件对象均会被spring mvc框架将其转换为MultipartFile类型,这个与单个文件上传一样,不需要@RequestParam修饰。

            但是上传多个文件时,处理器方法需要的不是MultipartFile类型,而是MultipartFile[]数组类型,默认情况下,框架会将表单中的表单元素一个个转换为文件对象,

            但并不会将多个文件对象创建为一个数组对象。此时就需要用@RequestParam注解修饰这个数组参数,需要框架调用相应的转换器将请求参数转换为方法参数类型。

            所以上传多个文件,处理器方法的MultipartFile[]数组必须使用@RequestParam注解修饰。

        2.未选择上传文件

            即使没有选择任何文件,MultipartFile[]数组也不为null。不仅不为null,其length值也大于0.

        
        因为系统会为每个file表单元素创建一个file对象。只不过没有选择上传文件的这个file将不会被赋予真正的文件,只是一个为empty的File。所以对于没有选择任何要上传的文件

        的情况的处理,只能逐个对文件表单元素进行判断,判断文件是否为empty。

spring mvc文件上传(单个文件上传|多个文件上传)的更多相关文章

  1. 【spring mvc】spring mvc POST方式接收单个字符串参数,不加注解,接收到的值为null,加上@RequestBody,接收到{"uid":"品牌分类大”},加上@RequestParam报错 ---- GET方式接收单个参数的方法

    spring mvc POST方式 接收单个参数,不加任何注解,参数名对应,接收到的值为null spring mvc POST方式 接收单个参数,加上@RequestBody,接收到参数格式:{&q ...

  2. spring mvc源码-》MultipartReques类-》主要是对文件上传进行的处理,在上传文件时,编码格式为enctype="multipart/form-data"格式,以二进制形式提交数据,提交方式为post方式。

    spring mvc源码->MultipartReques类-> MultipartReques类主要是对文件上传进行的处理,在上传文件时,编码格式为enctype="multi ...

  3. spring mvc 避免IE执行AJAX时,返回JSON出现下载文件

    <!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" c ...

  4. spring MVC 项目 WEB-INF下的jsp不能加载css文件

    一.项目目录 二.解决方法(已解决) 1. jsp文件加入 <link href="<c:url value="/css/main.css" />&qu ...

  5. Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)

    <bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...

  6. Springboot实现上传文件接口,使用python的requests进行组装报文上传文件的方法

    记录瞬间 近段时间使用Springboot实现了文件的上传服务,但是在使用python的requests进行post上传时,总是报错. 比如: 1.Current request is not a m ...

  7. Spring MVC 学习总结(六)——Spring+Spring MVC+MyBatis框架集成

    与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...

  8. Spring+Spring MVC+MyBatis

    Spring+Spring MVC+MyBatis 目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六. ...

  9. Spring+Spring MVC+MyBatis框架集成

    目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六.JUnit测试数据访问 七.完成Spring整合My ...

  10. Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)

    与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...

随机推荐

  1. flhs笔试题-回家上机实践

    这是最近参加的一个公司的笔试题,回家上机写了下代码,希望对有需要的小伙伴有用,简单实现字符串和数组在指定位置的插入: package org.flhs; import com.google.commo ...

  2. Prime Generator

    Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate ...

  3. Python VS PHP 基础语法

    这几天在学习Python,鄙人平时学习中为了方便记忆和更好的比较与理解语言二者之间在某些情况的优劣性,所以花了点时间,整理了一下 Python 和 PHP 常用语法的一些区别. 一.大小写 PHP: ...

  4. Centos6.2设置静态ip和dns

    参考了如下文章:https://gist.github.com/fernandoaleman/2172388http://www.lifelinux.com/how-to-configure-stat ...

  5. 自定义UITableViewCell实现左滑动多菜单功能LeftSwipe

    今天愚人节,小伙们,愚人节快乐! 实现一个小功能,滑动菜单,显示隐藏的功能菜单, 先上图:                       这里尝试用了下使用三个方式来实现了这个功能: 1.使用自定义UI ...

  6. 手游录屏直播技术详解 | 直播 SDK 性能优化实践

    在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...

  7. OC泛型

    OC泛型 泛型是程序设计语言的一种特性,他主要是为了限制类型的,比如OC中的数组,你可以限制他里面装的是NSString类型,泛型的话JAVA和C++都有的,大家要是对泛型不了解的话可以去百度一下. ...

  8. 简易版自定义BaseServlet

    这几天在学Java Web,一直在思考Servlet重用的问题,就用java的反射机制实现自定义的简易版BaseServlet; 该方式有点像struts2 利用映射获取前端的参数.有兴趣的同学可以自 ...

  9. 利用Sharding-Jdbc实现分表

    你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订单跟雪花一样纷沓而来. 慢慢地,你的心情开始变差,因为客户和产品的抱怨越来越频繁,抱怨的最多的一个问题就 ...

  10. [Erlang 0115] 2014值得期待的Erlang两本新书

    在2014年的开头就有这样一个令人振奋的好消息,Erlang有一本新书即将出版 <The Erlang Runtime System>,其作者happi在2013年3月份公布了这本书的写作 ...