上传单个文件

  1.定义具有文件上传功能的页面 index.jsp,其表单的设置需要注意,method 属性为 POST,

  enctype 属性为 multipart/form-data。另外,需要注意 file 表单元素的参数名称,Controller 中需要使用

  

  

  2.定义处理器

 public class MyController {

     @RequestMapping(value = "/upload.do")
public String fileUpload(HttpSession session,MultipartFile img) throws Exception {
// 用于接收文件的形参类型不是File,而是MultipartFile,MultipartFile 是一个接口,专门用于处理文件上传
//如没有点击上传文件,直接提交,mulFile也不会为null,而是一个内容为empty的文件,所以不能用 null 来判断
if(img.getSize() > 0) {
//目录必须提前创建,因为 transferTo 方法不会创建目标目录
String path = session.getServletContext().getRealPath("images");
//得到原始文件名
String fileName = img.getOriginalFilename();
//限制文件上传类型
if(fileName.endsWith("jpg") || fileName.endsWith("png")) {
File file = new File(path ,fileName );
//进行文件上传
img.transferTo(file);
}
else{
return "/error.jsp";
} }
return "/success.jsp";
} }

    1.用于接收表单元素所提交参数的处理器方法的形参类型不是 File,而是 MultipartFile。

    MultipartFile 为一个接口,专门用于处理文件上传问题。该接口中具有很多有用的方法,

    例 如 获 取 参 数 名 称 getName() ; 获 取 文 件 的 原 始 名 称 getOriginalFilename();

    获取文件大小 getSize();判断文件是否为空 isEmpty();文件上传 transferTo()等。   

    2.若用户未选择上传的文件就直接提交了表单,此时处理器方法的 MultipateFile 形参所接 收到的实参值并非为 null,

    而是一个内容为 empty 的文件。所以,对于未选择上传文件的情 况的处理,其判断条件为 file.isEmpty(),而非 file == null。

    3.SpringMVC 的文件上传功能并未有直接的用于限定文件上传类型的方法或属性,需要对 获取到的文件名后辍加以判断。

     此时使用 String 的 endWith()方法较为简捷。

    4.对于上传单个文件,直接使用 MultipartFile 的 transferTo()方法,就可以完成上传功能。

     但是,需要注意的是,该方法要求服务端用于存放客户上传文件的目录必须存在,否则报错。

     即其不会自己创建该目标目录。如本例中,必须手工创建 images 目录。

    

  3.注册文件上传处理器     

 <!-- 注册  multipartResolver 解析器,这个id 只能这样写 ,DisPatcherServlet(中央调度器) 会去通过这个id调用 这个bean-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 可以在这里进行一些属性的 设置 -->
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="1000000"></property>
</bean> <!-- 文件上传 需要使用 mvc 注解驱动,因为 MultipartFile 是一个接口,这个接口实现类的 创建 依赖于 mvc 注解驱动-->
<mvc:annotation-driven /> <!--当上传文件超出指定大小时,会抛出异常, 异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="/error.jsp"></property>
</bean>

  分析源码可以得到以下过程:

  如果容器中定义了名称为 multipartResolver  的 Bean,且请求也为 multipart 类型(即enctype 属性值为 multipart/form-data),

  则返回 MultipartHttpServletRequest 请求类型,完成 文件上传功能。否则,返回普通的 HttpServletRequest 请求类型。

多个文件

  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。

 public class MyController {

     @RequestMapping(value = "/upload.do")
//上传多个文件,使用的 形参类型为MultipartFile数组,且必须使用 注解 @RequestParam
//上传多个文件时,处理器方法需要的不是 Multipart ,而是MultipartFile[] ,默认情况下框架只会将一个一个的表单元素转换成一个一个的对象,并不会将这多个对象创建为一个数组对象
//使用 @RequestParam 来修饰,想框架表明,我就是要用 数组类型的,给我创建
public String fileUpload(HttpSession session,@RequestParam MultipartFile[] imgs) throws Exception {
// 用于接收文件的形参类型不是File,而是MultipartFile,MultipartFile 是一个接口,专门用于处理文件上传
//如没有点击上传文件,直接提交,mulFile也不会为null,而是一个内容为empty的文件,所以不能用 null 来判断
for(MultipartFile img:imgs) {
if(img.getSize() > 0) {
//目录必须提前创建,因为 transferTo 方法不会创建目标目录
String path = session.getServletContext().getRealPath("images");
//得到原始文件名
String fileName = img.getOriginalFilename();
//限制文件上传类型
if(fileName.endsWith("jpg") || fileName.endsWith("png")) {
File file = new File(path ,fileName );
//进行文件上传
img.transferTo(file);
}
else{
return "/error.jsp";
} }
}
return "/success.jsp";
} }

  

16.SpringMVC核心技术-文件上传的更多相关文章

  1. SpringMVC+ajax文件上传实例教程

    原文地址:https://blog.csdn.net/weixin_41092717/article/details/81080152 文件上传文件上传是项目开发中最常见的功能.为了能上传文件,必须将 ...

  2. springmvc图片文件上传接口

    springmvc图片文件上传 用MultipartFile文件方式传输 Controller package com.controller; import java.awt.image.Buffer ...

  3. SpringMVC学习--文件上传

    简介 文件上传是web开发中常见的需求之一,springMVC将文件上传进行了集成,可以方便快捷的进行开发. springmvc中对多部件类型解析 在 页面form中提交enctype="m ...

  4. Spring +SpringMVC 实现文件上传功能。。。

    要实现Spring +SpringMVC  实现文件上传功能. 第一步:下载 第二步: 新建一个web项目导入Spring 和SpringMVC的jar包(在MyEclipse里有自动生成spring ...

  5. SpringMVC之文件上传异常处理

    一般情况下,对上传的文件会进行大小的限制.如果超过指定大小时会抛出异常,一般会对异常进行捕获并友好的显示出来.以下用SpringMVC之文件上传进行完善. 首先配置CommonsMultipartRe ...

  6. springmvc实现文件上传

    springmvc实现文件上传 多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单,而该表单就要满足以下3个条件 (1)form表彰的method属 ...

  7. 【SpringMVC】文件上传Expected MultipartHttpServletRequest: is a MultipartResolver错误解决

    本文转载自:https://blog.csdn.net/lzgs_4/article/details/50465617 使用SpringMVC实现文件上传时,后台使用了 MultipartFile类, ...

  8. 关于SpringMVC的文件上传

    关于文件的上传,之前写过2篇文章,基于Struts2框架,下面给出文章链接: <关于Struts2的文件上传>:http://www.cnblogs.com/lichenwei/p/392 ...

  9. 一起学SpringMVC之文件上传

    概述 在Web系统开发过程中,文件上传是普遍的功能,本文主要以一个简单的小例子,讲解SpringMVC中文件上传的使用方法,仅供学习分享使用,如有不足之处,还请指正. 文件上传依赖包 如下所示,文件上 ...

随机推荐

  1. faster-rcnn 测试自己数据集训练的模型

    python demo_2019051601.pyTraceback (most recent call last): File "demo_2019051601.py", lin ...

  2. Qt编写自定义控件20-自定义饼图

    前言 上次在写可视化数据大屏电子看板项目的时候,为了逐步移除对QChart的依赖(主要是因为QChart真的太垃圾了,是所有Qt的模块中源码最烂的一个,看过源码的人没有一个不吐槽,不仅不支持10W级别 ...

  3. Java 检查IPv6地址的合法性

    Java 检查IPv6地址的合法性 由于IPv4资源即将耗尽,IPv6将要正式启用,这是大势所趋. 一些现有的服务和应用逐步要对IPv6支持,目前还处在过渡阶段. 提前了解一些IPv6的知识,还是有必 ...

  4. Pocsuite3--编写破壳CVE-2014-6271_Shellshock的POC

    前言 编写破壳CVE-2014-6271_Shellshock的POC,把公开出来的路径封装起来,作为Pocsuite3的验证POC 情况1:网站无法访问,返回失败 情况2:网站可以访问,无漏洞 情况 ...

  5. 4.1 python类的特殊成员,偏函数,线程安全,栈,flask上下文

    目录 一. Python 类的特殊成员(部分) 二. Python偏函数 1. 描述 2. 实例一: 取余函数 3. 实例二: 求三个数的和 三. 线程安全 1. 实例一: 无线程,消耗时间过长 2. ...

  6. web框架学习路线

    0.配置 1.路由 2.view 3.model 4.序列化与反序列化. 5.auth&permission 6.header处理 7.http client

  7. Anaconda中安装Cascade RCNN(Detectron)的若干问题

    安装参考https://github.com/zhaoweicai/Detectron-Cascade-RCNN/blob/master/INSTALL.md 1.对于在 python detectr ...

  8. pandas越来越难学,只能自己找趣味了,你该这么学,No.11

    啊,大海啊,全是水 pandas啊,全是坑 没错,今天继续学习难的 其实从这篇开始,每一篇都是难得...... 你必须要努力看了 文末有彩蛋 分层/多级索引 我们先创建一个分层索引,看看效果 这个创建 ...

  9. Windows 与 linux文件相互传输的方法

    公司里面办公机器大部分都是 windows 但是现在随着云计算.docker.linux等的越来越兴起,需要大量的操作linux服务器. 最重要和最直接的需要将windows 上面的文件上传到 lin ...

  10. pymysql连接和操作Mysql数据库

    pymysql 一.概要 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库, 二.PyMySQL 安装 pip install pymysql 三.操作流程 创建c ...