spring mvc文件上传(单个文件上传|多个文件上传)

mac2022-06-30  30

单个文件上传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。           

转载于:https://www.cnblogs.com/dengfukui/p/6252798.html

最新回复(0)