单个文件上传

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. 移动端API接口优化的术和结果

    最近一直在忙工作的事情,所以文章写得有些少. 有3-5篇文章都是写到一半然后被别的事情给打断了,所以,我得找个时间好好补补. 最近一直在关注移动端接口API的可用性问题,在移动时代这个做这个优化能产生 ...

  2. 《分布式事务解决之道》沙龙ppt共享

    大型分布式系统往往由很多“微服务”组成,而不同的微服务往往又连接着不同的数据库,在看似常用的功能背后,可能又需要横跨不同的“微服务”和“数据库”才能实现.那么如何才能保证系统事务的一致性呢?这也同时是 ...

  3. EF 添加方式比较

    using System; using System.Collections.Generic; using DBAccess.Models; using EntityFramework.BulkIns ...

  4. instanceof 运算符

    java中的instanceof=======>二元运算符 用法: result = object instanceof class 参数: result 是boolean类型 object 是 ...

  5. SQLSERVER截取字符串

    ) SET @Name = '\EXAM\061023478874' DECLARE @Position INT --sql first indexof SET @Position = CHARIND ...

  6. CSS3之3d变换与关键帧

    3d变换是在transform基础上实现的 transform-style:preserve-3d; 建立3d空间 perspective:; 景深(设置用户看的距离) perspective-ori ...

  7. JavaScript学习笔记4之 ByClass&json

    一.通过class获取标签 var out=document.getElementsByClassName(‘out’);IE 6 7 8 不支持 getElementsName 是否有办法既能通过c ...

  8. SAP CRM BOL编程基础,代码+详细注释

    网络上可以找到一些使用BOL查询.维护数据的DEMO,但几乎都是单纯的代码,缺乏说明,难以理解.本文除了代码外,还给出了详细的注释,有助于理解BOL编程中的一些基本概念. 这是一篇翻译的文章,你可能会 ...

  9. View and Data API Tips : Conversion between DbId and node

    By Daniel Du In View and Data client side API, The assets in the Autodesk Viewer have an object tree ...

  10. Android Weekly Notes Issue #218

    Android Weekly Issue #218 August 14th, 2016 http://androidweekly.net/issues/issue-218 ARTICLES & ...