SpringMVC---- SpringMVC文件上传

上一篇👉:SpringMVC---- SpringMVC的请求和响应(三)



🚴大家好!我是近视的脚踏实地,后边这系列是自己自学Spring框架的学习笔记,这篇文章学习关于SpringMVC 的数据请求的 相关知识
     唯有行动  才能解除你所有的不安

1. 文件上传

1.1 文件上传

(文件上传也属于客户端把数据发送到服务器,服务器端接收客户端的数据,但这个时候服务端接收客户端请求数据,它就是不是一个普通数据,可能是一个文件。)
1. 文件上传客户端三要素
(首先复习文件上传客户端具备的几要素,文件上传跟其他普通表单不一样,他必须是文件上传表单才可以,三要素)
● 表单项type=“file”
● 表单的提交方式是post
● 表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”
在这里插入图片描述
(第三要素记得要选multipart/form-data,圈起来的是默认的形式,url编码方式,如果是url编码方式,那么你提交的参数格式都是键值对形式。文件上传就必须选择多部分形式)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/user/quick22" method="post" enctype="multipart/form-data">
        名称:<input type="text" name="username"><br/>
        文件:<input type="file" name="uploadFile"><br/>
        <input type="submit" name="提交"><br/>
    </form>
</body>
</html>

2. 文件上传原理

● 当form表单修改为多部分表单时,request.getParameter()将失效。
(包括getParameterMap()这些都会失效,因为这个request在get某某方法时,它其实获得的是url编码方式的表单提交,而文件上传的是多部分表单形势,所以这些api都失效了)
● enctype=“application/x-www-form-urlencoded”时,form表单的正文内容格式是:key=value&key=value&key=value
● 当form表单的enctype取值为Mutilpart/form-data时,请求正文内容就变成多部分形式:
在这里插入图片描述
(右边就是他的请求正文,name 是普通表单项,file是文件上传项,通过抓包可以发file就是不是键值对形式的了。那么服务端可以获取你表单上的所有信息,包括文件名称,文件的所有内容等等)

1.2 单文件上传步骤

1️⃣:导入fileupload和io坐标
(当时在web阶段,文件上传时,我们使用最原始的java基础来获取,获取完之后通过字符串切割等等相应的操作,但这样太麻烦了,然后由用了一个插件,apache的一个fileupload插件,这个插件,将文件上传的api封装得比较完全,操作时比较简单。但现在我们学的是框架,用更简单的,那么其实他的底层封装的也是fileupload,所以我们要玩这个东西,第一就是导入那个插件的坐标。)
2️⃣:配置文件上传解析器
(在springmvc配置文件中我们可以指定一些配置的参数,比如说每个上传文件的大小,上传文件的总大小等等)
3️⃣:编写文件上传代码

1.3 单文件上传实现

1️⃣:导入fileupload和io坐标

<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.3</version>
    </dependency>

2️⃣:配置文件上传解析器
(主要是配CommonsMultipartResolver)

<!--配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--上传文件的编码类型-->
        <property name="defaultEncoding" value="UTF-8"/>
        <!--上传文件总大小-->
        <property name="maxUploadSize" value="500000"/>
        <!--上传单个文件的大小-->
        <property name="maxUploadSizePerFile" value="5242800"/>
    </bean>

3️⃣:编写文件上传代码
(文件上传代码和前边接收普通数据一样,比如说封装相应的参数,我们当时在讲获得请求参数时,只要参数名和请求的参数名称一致他就能自动帮我们匹配,这个地方也一样,只不过这个地方文件上传的那个文件到了controller方法内,SpringMVC会把这个文件封装为一个对象,这个对象叫做MultipartFile,那么MultipartFile这个类型的名字要跟你当前你文件上传表单中的file的名字一致,就是那个name属性的值)

@RequestMapping(value ="/quick22")
    @ResponseBody
    public void save22(String username, MultipartFile uploadFile) {
        System.out.println(username);
        System.out.println(uploadFile);
    }

启动服务器运行,发现uploadFile对象是有值的,说明文件上传成功了👇:
在这里插入图片描述
在这里插入图片描述

那么文件已经传到服务器端了,下面我们就可以把这个文件进行保存,保存这个无非就是指定名称,将这个文件存到服务器磁盘上。代码如下👇:
在这里插入图片描述

(首先是用getOriginalFilename()拿到这个文件的名称,接着是把文件存到某个位置,可以用原始的io去存,在这本身这个MultipartFile的对象uploadFile它本身就有相应的方法transferTo,将这个文件转移到每个地方,内部要个file对象,那么我们就给一个,这个file里边给的就是地址,后期开发中的地址肯定是某台服务器的一个地址,可能是个网络地址,现在是单机的,我随便存在D盘的hello文件夹,这个事先已经创建好了,然后后边加上文件名称 )

接着重新启动服务测试👇:
在这里插入图片描述
控制台👇:
在这里插入图片描述
D盘👇:
在这里插入图片描述

1.4 多文件上传实现

多文件上传,只需要将页面修改为多个文件上传项,将方法参数MultipartFile类型修改为MultipartFile[]即可
在这里插入图片描述

服务端👇:
(一定要注意参数名字要和表单中的name属性的值一致,才能匹配上。)
在这里插入图片描述

重启服务器再来测试👇:
在这里插入图片描述
控制台👇:
在这里插入图片描述
D盘👇:
在这里插入图片描述

1.5 知识要点

MVC实现数据请求方式
● 基本类型参数
● POJO类型参数
● 数组类型参数
● 集合类型参数

MVC获取数据细节
● 中文乱码问题
● @RequestParam 和 @PathVariable
● 自定义类型转换器
● 获得Servlet相关API
● @RequestHeader 和 @CookieValue
● 文件上传


下一篇👉SpringMVC---- SpringMVC拦截器

本篇博客到这就完啦,非常感谢您的阅读🙏,那么下一篇将会继续学习关于SpringMVC 拦截器的 相关知识,如果对您有帮助,可以帮忙点个赞或者来波关注鼓励一下喔😬

相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页