spring mvc文件上传(单个文件上传|多个文件上传)
单个文件上传
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。
spring mvc文件上传(单个文件上传|多个文件上传)的更多相关文章
- 【spring mvc】spring mvc POST方式接收单个字符串参数,不加注解,接收到的值为null,加上@RequestBody,接收到{"uid":"品牌分类大”},加上@RequestParam报错 ---- GET方式接收单个参数的方法
spring mvc POST方式 接收单个参数,不加任何注解,参数名对应,接收到的值为null spring mvc POST方式 接收单个参数,加上@RequestBody,接收到参数格式:{&q ...
- spring mvc源码-》MultipartReques类-》主要是对文件上传进行的处理,在上传文件时,编码格式为enctype="multipart/form-data"格式,以二进制形式提交数据,提交方式为post方式。
spring mvc源码->MultipartReques类-> MultipartReques类主要是对文件上传进行的处理,在上传文件时,编码格式为enctype="multi ...
- spring mvc 避免IE执行AJAX时,返回JSON出现下载文件
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" c ...
- spring MVC 项目 WEB-INF下的jsp不能加载css文件
一.项目目录 二.解决方法(已解决) 1. jsp文件加入 <link href="<c:url value="/css/main.css" />&qu ...
- Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)
<bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...
- Springboot实现上传文件接口,使用python的requests进行组装报文上传文件的方法
记录瞬间 近段时间使用Springboot实现了文件的上传服务,但是在使用python的requests进行post上传时,总是报错. 比如: 1.Current request is not a m ...
- Spring MVC 学习总结(六)——Spring+Spring MVC+MyBatis框架集成
与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...
- Spring+Spring MVC+MyBatis
Spring+Spring MVC+MyBatis 目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六. ...
- Spring+Spring MVC+MyBatis框架集成
目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六.JUnit测试数据访问 七.完成Spring整合My ...
- Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)
与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...
随机推荐
- Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决
最近一直在开发XX的uwp版本,也是边摸索边做,最近遇到几个比较奇怪的问题,记录于此. 1.项目可用部署到PC,但无法部署到手机,提示以下错误: 错误 : DEP0001 : 意外错误: Instal ...
- [Tool] 插入折叠区域功能
之前写了一个 仿博客园网页端推荐的插入代码插件, 后来在总结一些技术文档时,总是想把一些属性或者方法,参数等,都用表格的形式清晰的列举出来,但是插入的表格太大的话,上下跨度就显得特别大,来回上下滚动的 ...
- WPF 后台数据触发改变界面状态-心跳实现
今年做的一个上位机工控WPF项目,做个小小的总结把,以后随时来找 请不要带血乱喷,我只是菜鸟.___by 鲍队 类似于这样子的;大致的意思是:一个代码变量,通过改变变量的值,绑定这个变量的这个圆颜色也 ...
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- 浏览器对localstorage的支持情况以及localstorage在saas系统中的应用实践思考
首先,还是要说,任何一种新特性的引入,通常有着其特有的场景和解决的目标需求,localstorage也一样.在我们的应用场景中,主要在金融业务服务的saas系统.其中涉及很多更改频率很多的元数据的客户 ...
- Threejs中的材质贴图
最近项目需要折腾three.js,有关three.js几点说明 1.作用 threejs适合创建简单的模型视图 2.对于复杂的模型图(如:室内模型图)需要美术3D制作,前端导成特定格式文件(如*.mt ...
- 在Thinkphp中使用AJAX实现无刷新分页
在Thinkphp目录的Lib\ORG\Util\目录里新建AjaxPage.class.php,写入一下内容: <?php // +------------------------------ ...
- infopath发布的提示“无法解析SOAP消息”(The SOAP message cannot be parsed)问题解决方案
最近发现一个列表数据过大,每次发布infopath表单提示如下错误: 后来发现一个infopath表单通过list.asmx and Formsservice.asmx来进行发布的. This err ...
- 静态库介绍与简单演练及同名资源冲突解决(.a格式的静态库)
1.静态库和动态库都是闭源库,不公开源代码. 静态库:.a和.framework 动态库:.dylib和.framework(iOS9取消了.dylib,使用.tbd替代) 2.静态库和动态库在使用上 ...
- win2003 Enterprise x64 Edtion中的DCOM服务找不到WORD应用程序
打开注册表,找到以下健值 HKEY_CLASSES_ROOT\AppID\{00020906-0000-0000-C000-000000000046} HKEY_CLASSES_ROOT\CLSID\ ...