springmvc文件上传
-
使用apche fileupload
-
直接使用servlet3.0的新特性
apache方案
单文件处理方案
-
添加依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
-
注册文件上传解析器
<!--注册文件上传解析器--> <!--名字一定要叫multipartResolver--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--文件上传最大尺寸--> <property name="maxUploadSize" value="500000000"/> </bean>
-
编写页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件上传</title> </head> <body> <form action="/upload/m1" method="post" enctype="multipart/form-data"> ` 名称: <input type="text" name="name"><br /> <br /> <input type="submit" value="上传"> </form> </body> </html>
注意必须写:enctype="multipart/form-data"
否则后台无法正确解析
-
后台处理
-
package com.sz.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Controller @RequestMapping("/upload") public class UploadController { // 定义文件上传根路径 private String path = "D:" + File.separator + "upload"; @RequestMapping("/m1") @ResponseBody // 使用注解标记上传文件 public Map<String,Integer> m1(@RequestParam("file")MultipartFile multipartFile, @RequestParam("name") String name){ System.out.println("普通的文本域:" + name); // 如果不为空,再准备上传 Map<String,Integer> map = new HashMap<>(); int code = 4300; if(!multipartFile.isEmpty()) { BufferedOutputStream bs = null; try { byte[] bytes = multipartFile.getBytes(); // 构建文件对象,准备上传 File file = new File(path ); // 如果路径海不存在,则创建 if(!file.exists()) file.mkdirs(); // 获取文件原始名称 String originalFilename = multipartFile.getOriginalFilename(); // 获取文件前缀(比如hello.txt 取出hello)不含后缀 String prefix = originalFilename.substring(0,originalFilename.lastIndexOf(".")); // 获取文件后缀名 .txt String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); // 上传后的文件名加上时间戳 String newFileName = prefix + System.currentTimeMillis() + suffix ; // 构建文件对象 File uploadFile = new File(path+ File.separator + newFileName); // 通过输出流写出 bs = new BufferedOutputStream(new FileOutputStream(uploadFile)); bs.write(bytes); code = 2000; } catch (IOException e) { e.printStackTrace(); } finally { if(bs !=null){ try { bs.close(); } catch (IOException e) { e.printStackTrace(); } } } } map.put("msg",code); return map; } }
其实输出流处理有更简单的办法:
-
简化
package com.sz.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Controller @RequestMapping("/upload") public class UploadController { // 定义文件上传根路径 private String path = "D:" + File.separator + "upload"; @RequestMapping("/m1") @ResponseBody // 使用注解标记上传文件 public Map<String,Integer> m1(@RequestParam("file")MultipartFile multipartFile, @RequestParam("name") String name){ System.out.println("普通的文本域:" + name); // 如果不为空,再准备上传 Map<String,Integer> map = new HashMap<>(); int code = 4300; if(!multipartFile.isEmpty()) { try { byte[] bytes = multipartFile.getBytes(); // 构建文件对象,准备上传 File file = new File(path ); // 如果路径海不存在,则创建 if(!file.exists()) file.mkdirs(); // 获取文件原始名称 String originalFilename = multipartFile.getOriginalFilename(); // 获取文件前缀(比如hello.txt 取出hello)不含后缀 String prefix = originalFilename.substring(0,originalFilename.lastIndexOf(".")); // 获取文件后缀名 .txt String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); // 上传后的文件名加上时间戳 String newFileName = prefix + System.currentTimeMillis() + suffix ; // 构建文件对象 File uploadFile = new File(path+ File.separator + newFileName); // 通过输出流写出 code = 2000; // 一行写出去 multipartFile.transferTo(uploadFile); } catch (IOException e) { e.printStackTrace(); } } map.put("msg",code); return map; } }
多文件处理方案
如果说是一组也是一样的解决方案,可以多设立几个requestparam,也可以直接一组搞定。
-
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件上传</title> </head> <body> <form action="/upload/m1" method="post" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="file" name="file"><br> <input type="file" name="file"><br> 名称: <input type="text" name="name"><br /> <input type="submit" value="上传"> </form> </body> </html>
-
后台
package com.sz.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Controller @RequestMapping("/upload") public class UploadController { // 定义文件上传根路径 private String path = "D:" + File.separator + "upload"; @RequestMapping("/m1") @ResponseBody // 使用注解标记上传文件 public Map<String,Integer> m1(@RequestParam("file")MultipartFile[] multipartFiles, @RequestParam("name") String name){ System.out.println("普通的文本域:" + name); // 如果不为空,再准备上传 Map<String,Integer> map = new HashMap<>(); int code = 4300; if(multipartFiles != null && multipartFiles.length > 0){ for(MultipartFile multipartFile:multipartFiles){ if(!multipartFile.isEmpty()) { try { byte[] bytes = multipartFile.getBytes(); // 构建文件对象,准备上传 File file = new File(path ); // 如果路径海不存在,则创建 if(!file.exists()) file.mkdirs(); // 获取文件原始名称 String originalFilename = multipartFile.getOriginalFilename(); // 获取文件前缀(比如hello.txt 取出hello)不含后缀 String prefix = originalFilename.substring(0,originalFilename.lastIndexOf(".")); // 获取文件后缀名 .txt String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); // 上传后的文件名加上时间戳 String newFileName = prefix + System.currentTimeMillis() + suffix ; // 构建文件对象 File uploadFile = new File(path+ File.separator + newFileName); // 通过输出流写出 code = 2000; multipartFile.transferTo(uploadFile); } catch (IOException e) { e.printStackTrace(); } } map.put("msg",code); } } return map; } }
servlet3.0解决方案
将文件解析器替换为标准的解析器一样可以完成,代码可以不用发生变化
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"> </bean>
web.xml当中直接对DS进行参数化配置
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <multipart-config> <max-file-size>500000000</max-file-size> </multipart-config> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>