当前位置:网站首页>MultipartFile文件上传
MultipartFile文件上传
2022-07-31 02:58:00 【wfsm】
引用:https://www.cnblogs.com/896240130Master/p/6430908.html
springmvc 中,文件的上传是通过
MultipartResolver
实现的,所以,如果要实现文件的上传,只要在spring-servlet.xml
中注册相应的MultipartResovler
MultipartResolver
实现类:
CommonsMultipartResolver
StandardServletMultipartResolver
区别:
第一个需要使用 Apache 的 commons-fileupload
等jar包支持,但能在比较旧的 servlet 版本中使用
第二个不需要第三方jar包支持,他使用servlet内置的上传功能,但只能在servlet3 以上版本使用
引入 CommonsMultipartResolver
在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>
引入StandardServletMultipartResolver
在spring-servlet.xml
中引入 StandardServletMultipartResolver
的bean
<bean class="org.springframework.web.multipart.support.StandardServletMultipartResolver" name="multipartResolver">
</bean>
在 web.xml
中 添加 multipart-config
配置
<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:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!-- 上传文件的大小限制 5M-->
<max-file-size>5242880</max-file-size>
<!-- 一次表单提交中文件的大小限制 10M-->
<max-request-size>10485760</max-request-size>
<!-- 多大的文件会被自动保存到硬盘上, 0 代表所有-->
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
代码:
jar包:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</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
springboot中使用 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;
}
边栏推荐
- Difference between CMOS and TTL?
- YOLOV5学习笔记(三)——网络模块详解
- CorelDRAW2022 streamlined Asia Pacific new features in detail
- VS QT——ui不显示新添加成员(控件)||代码无提示
- 共模电感的仿真应用来了,满满的干货送给大家
- 【HCIP】ISIS
- 工程(五)——小目标检测tph-yolov5
- 加密公司向盗窃的黑客提供报价:保留一点,把剩下的归还
- Local area network computer hardware information collection tool
- return in try-catch
猜你喜欢
php 网站的多语言设置(IP地址区分国内国外)
Project (5) - Small target detection tph-yolov5
什么是分布式锁?实现分布式锁的三种方式
数学解决——环形链表问题
STM32CUBEMX develops GD32F303 (11) ---- ADC scans multiple channels in DMA mode
CMOS和TTL的区别?
工程(五)——小目标检测tph-yolov5
知识蒸馏7:知识蒸馏代码详解
The application of AI in the whole process of medical imaging equipment
【Android】Room —— SQLite的替代品
随机推荐
如何搭建私有yum源
7、私信列表
知识蒸馏7:知识蒸馏代码详解
Why is String immutable?
execsnoop 工具
Mycat's master-slave relationship, vertical sub-database, horizontal sub-table, and detailed configuration of mycat fragmented table query (mysql5.7 series)
STM32CUBEMX develops GD32F303 (11) ---- ADC scans multiple channels in DMA mode
mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)
什么是系统?
Refuse to work overtime, a productivity tool set developed by programmers
JetPack组件Databinding
Modbus on AT32 MCU
11. Redis implements follow, unfollow, and follow and follower lists
YOLOV5学习笔记(三)——网络模块详解
Android's webview cache related knowledge collection
Unity3D Button 鼠标悬浮进入与鼠标悬浮退出按钮事件
SQALE 是什么
测试中的误报和漏报同样的值得反复修正
LeetCode 每日一题 2022/7/25-2022/7/31
BAT can't sell "Medical Cloud": Hospitals flee, mountains stand, and there are rules