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