引用:https://www.cnblogs.com/896240130Master/p/6430908.html
springmvc 中,文件的上传是通过
MultipartResolver实现的,所以,如果要实现文件的上传,只要在spring-servlet.xml中注册相应的MultipartResovler
MultipartResolver实现类:
CommonsMultipartResolverStandardServletMultipartResolver
区别:
第一个需要使用 Apache 的 commons-fileupload 等jar包支持,但能在比较旧的 servlet 版本中使用
第二个不需要第三方jar包支持,他使用servlet内置的上传功能,但只能在servlet3 以上版本使用
在spring-servlet.xml 中 引入 CommonsMultipartResolver 的bean
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10485760000" />
<property name="maxInMemorySize" value="40960"/>
bean>
在spring-servlet.xml 中引入 StandardServletMultipartResolver 的bean
<bean class="org.springframework.web.multipart.support.StandardServletMultipartResolver" name="multipartResolver">
bean>
在 web.xml中 添加 multipart-config 配置
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
<multipart-config>
<max-file-size>5242880max-file-size>
<max-request-size>10485760max-request-size>
<file-size-threshold>0file-size-threshold>
multipart-config>
servlet>
代码:
jar包:
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>2.5version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.2.5.RELEASEversion>
dependency>
@RestController
public class HelloController {
@PostMapping("/upload")
public String hello(HttpServletRequest request){
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
System.out.println(multipartResolver.isMultipart(request));
// 判断是否有文件上传
if (multipartResolver.isMultipart(request)){
// 获取MultipartHttpServletRequest
MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request);
// MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 获取request中 所有文件名
Iterator<String> iterator = multiRequest.getFileNames();
while (iterator.hasNext()){
MultipartFile file = multiRequest.getFile(iterator.next());
if (!file.isEmpty()){
// 上传到这个路径
String path = "F:\\images";
String fileName = file.getOriginalFilename();
String newName = UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));
File targetFile = new File(path, newName);
try {
file.transferTo(targetFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return "success";
}
@PostMapping("/upload02")
public String upload(MultipartFile[] files,HttpServletRequest request) throws IOException {
if (files != null && files.length>0){
for (MultipartFile file : files) {
System.out.println("文件流"+file.getInputStream());
System.out.println("文件字节大小"+file.getSize());
System.out.println("文件类型"+file.getContentType());
System.out.println("文件数据:"+file.getBytes());
System.out.println(file.getName());
System.out.println(file.getOriginalFilename());
// servletContext.getRealPath("/")
String filePath = request.getSession().getServletContext().getRealPath("/")+"assets";
File dir = new File(filePath);
if (!dir.exists()){
dir.mkdirs();
}
String fileUrl = filePath +File.separator+ file.getOriginalFilename();
file.transferTo(new File(fileUrl));
}
}
return "hehe";
}
}
postman发送 带file的请求

MultipartFile 为null
解决: 1. 没有注入bean , CommonsMultipartResolver 或者 StandardServletMultipartResolver ,
2 . 前端传入的名字必须和 MultipartFile 的名字 相同
request 转 MultipartHttpServletRequest 报错
解决:multipartResolver.resolveMultipart(request)
// 获取MultipartHttpServletRequest
MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request);
引用:https://blog.csdn.net/MTone1/article/details/83826124
CommonsMultipartResolver默认引入的是StandardServletMultipartResolver

注入CommonsMultipartResolver
@Bean
CommonsMultipartResolver commonsMultipartResolver(){
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setDefaultEncoding("utf-8");
multipartResolver.setResolveLazily(true);
multipartResolver.setMaxInMemorySize(40960);
// 上传文件大小 50M : 50*1024*1024
multipartResolver.setMaxUploadSize(50*1024*1024);
return multipartResolver;
}
