Springmvc之文件上传

Springmvc之文件上传

一、上传单个文件

1.1 定义上传页面

定义具有文件上传功能的页面 index.jsp,其表单的设置需要注意,method 属性为 POST, enctype 属性为 multipart/form-data。另外,需要注意 file 表单元素的参数名称,Controller 中需要使用。 

 

1.2 定义处理器


对于处理器的定义,需要注意一下几点

(1),处理器方法的形参

用于接收表单元素所提交参数的处理器方法的形参类型不是 File,而是 MultipartFile。 MultipartFile 为一个接口,专门用于处理文件上传问题。该接口中具有很多有用的方法,例 如 获 取 参 数 名 称 getName() , 本 例 指 的 是 homework ; 获 取 文 件 的 原 始 名 称 getOriginalFilename();获取文件大小 getSize();判断文件是否为空 isEmpty();文件上传 transferTo()等。 

MultipartFile 接口常用的实现类为 CommonsMultipartResolver。而该实现类中具有设置 上传文件大小、上传文件字符集等属性,可以通过为其注入值,来限定上传的文件。 

(2),未选择上传文件

若用户未选择上传的文件就直接提交了表单,此时处理器方法的 MultipateFile 形参所接 收到的实参值并非为 null,而是一个内容为 empty 的文件。所以,对于未选择上传文件的情 况的处理,其判断条件为 file.isEmpty(),而非 file == null。 

(3),上传文件类型

SpringMVC 的文件上传功能并未有直接的用于限定文件上传类型的方法或属性,需要对 获取到的文件名后辍加以判断。此时使用 String 的 endWith()方法较为简捷。 

(4),上传方法

对于上传单个文件,直接使用 MultipartFile 的 transferTo()方法,就可以完成上传功能。 但是,需要注意的是,该方法要求服务端用于存放客户上传文件的目录必须存在,否则报错。 即其不会自己创建该目标目录。

1.3 在Springmvc中注册文件上传处理器


MultipartFile 接 口 的 实 现 类 CommonsMultipartResolver 继 承 自 CommonsFileUploadSupport 类,而该类有一个属性 maxUploadSize 可以用来限定上传文件的 大小,单位字节 B。如果不对该属性进行设置,或指定其值为-1,则表示不对上传文件大小 作限制。 

注意,该大小为上传文件的总大小。即,若上传多个文件,则多个文件的大小之和不能 大小该设定值。  当然,也可通过设置属性 maxUploadSizePerFile,再添加对每个上传文件的大小设置。 即每个文件的大小不能超过 maxUploadSizePerFile 指定值,而文件大小总和也不能超过 maxUploadSize 指定值。 

1.4 设置文件超出大小的异常处理

当上传文件超出指定大小时,会抛出 MaxUploadSizeExceededException 异常。通过在 SpringMVC 配置文件中设置 SimpleMappingExceptionResolver,可实现对该异常的处理。 

二、上传多个文件

2.1 修改index页面


注意:这多个file表单元素名称相同

2.2 修改处理器类


(1)处理器方法的形参

用于接收表单元素所提交参数的处理器方法的形参类型为 MultipartFile 数组,且必须使 用注解@RequestParam 修饰。  为什么上传单个文件时 MultipartFile 参数不用使用@RequestParam 修饰,而上传多个文 件时 MultipartFile[]就需要@RequestParam 修饰呢? 因为在上传多个文件时,每个表单中的文件对象框架均会将其转换为MultipartFile类型, 这是与上传单个文件是相同的,不需要@RequestParam 修饰。但上传多个文件时,处理器方 法需要的不是 MultipartFile 类型参数,而是 MultipartFile[]数组类型。默认情况下框架只会将 一个一个的表单元素转换为一个一个的对象,但并不会将这多个对象创建为一个数组对象。

 此时,需要使用@RequestParam 来修饰这个数组参数,向框架表明,表单传来的参数与 处理器方法接收的参数名称与类型相同,需要框架调用相应的转换器将请求参数转换为方法 参数类型。所以,对于上传多个文件,处理器方法的 MultipartFile[]数组参数必须使用注解 @RequestParam 修饰。 

(2)未选择上传文件

即使没有选择任何要上传的文件,MultipartFile 数组也不为 null。不仅不为 null,其 length 值也大于 0。因为系统会为每个 file 表单元素创建一个 File 对象,只不过没有选择上传文件 的这个 File 将不会被赋予真正的文件,只是一个为 empty 的 File。所以对于没有选择任何要上传的文件的情况的处理,只能逐个文件表单元素进行判断,判断文件是否为 empty。 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值