龙空技术网

SpringBoot 文件上传和下载(二)

JU帮 162

前言:

此刻各位老铁们对“html上传大文件”可能比较注重,小伙伴们都需要分析一些“html上传大文件”的相关资讯。那么小编同时在网摘上搜集了一些对于“html上传大文件””的相关内容,希望姐妹们能喜欢,同学们一起来了解一下吧!

在上一篇文章《SpringBoot 文件上传和下载(一)》中,我们简绍了 HTTP 中关于 MIME 类型、HTTP Header Content-Type 和 Content-Disposition 的内容。

在本篇和后续篇章中正式开始学习一下 SpringBoot 中文件上传的知识,测试的场景分为三类:

通过 HTML 页面上传文件通过 Jmeter、Postman、IDEA HTTP Client 工具上传通过 SpringBoot 服务上传

本篇学习如何通过 HTML 页面上传文件

创建 HTML 页面

我们先简单写一个用于上传文件的 HTML 页面,效果如下:

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>测试文件上传</title>  <style>    div {      padding: 5px;    }  </style></head><body><form method="post" action="; enctype="multipart/form-data">  <div><label>文件描述:<input type="text" name="fileDesc"></label></div>  <div><label>过期时间:<input type="date" name="expirationTime"></label></div>  <div><label>选择文件:<input type="file" name="fileContent"></label></div>  <div><input type="submit" value="提交信息"></div></form></body></html>
创建 SpringBoot 微服务

创建 SpringBoot 微服务,创建用于测试文件上传的 Controller,如下所示:

@Slf4j@RestControllerpublic class UploadFileController {    @PostMapping("/test/upload/file")    public String upload(@RequestParam String fileDesc, @RequestParam String expirationTime,                         @RequestParam MultipartFile fileContent) {        log.info("文件上传信息:fileDesc={}; expirationTime={}; fileName={}", fileDesc,                expirationTime, fileContent.getOriginalFilename());        return "SUCCESS";    }}

SpringBoot 配置使用默认,即端口号为 8080

填写表单,发送请求

填写 HTML 页面表单如下所示:

点击 “提交信息” 按钮,发送请求到服务器,服务器输出日志结果如下所示:

文件上传信息:fileDesc=文件描述信息; expirationTime=2023-03-08; fileName=image-test-file.png

结果分析

就上面的简单示例,我们分析一下文件是如何上传的,SpringBoot 服务是如何接收的:

HTML 中 form 表单属性值注意点如果表单包括了文件上传,enctype 必须设置为 multipart/form-data,在文章《SpringBoot 文件上传和下载(一)》中简绍 multipart/form-data 是一种复合 MIME 类型,可以在一次请求中,包含多种单一 MIME 类型。在本次示例中,包括两种 MIME 单一类型:① fileDesc 和 expirationTime 是文本类型(text/plain)② 文件对应的具体类型(image/jpeg)或字节流类型(application/octet-stream),具体在分析 multipart/form-data 请求报文时可以看到。如果设置 enctype 值,这 form method 必须为 postController 中的注意点在本次示例中,HTTP 请求中参数与方法同名参数映射采用的注解是 @RequestParam(对于 HTML 通过 form 表单发送简单参数可以使用,后面我们会看到使用 @RequestPart 注解,具体两个注解的区别后面简绍)。对于接收文件流,可以使用 Spring 提供的 org.springframework.web.multipart.MultipartFile 类,Spring 会将 multipart/form-data 请求中文件信息封装到 MultipartFile 类的实例中。查看 HTML 发送的请求报文请求消息头中,我们可以看到 Content-Type 为 multipart/form-data; boundary=xxxxx,其中 boundary 定义了请消息体中,每部分的分隔字符串请求消息体中,我们可以看到有与 HTML 三个字段相对应的三部分数据,各部分数据之间使用 boundary 字符串分隔。这三部分数据分为两类:① 第一部分和第二部分为普通字符串,Content-Disposition 值为 form-data; name="字段名",后面为空行和该字段对应的值,虽然没有设置 Content-Type,其实默认为 text/plain;② 第三部分为上传的文件信息,Content-Disposition 值为 form-data; name="字段名"; filename="文件名称",后面是空行和上传的文件数据(浏览器做了优化,不显示文件数据),Content-Type 值为 text/plain(因为我们测试的文件为 txt 文件)。(请求信息中就包括了 Content-Disposition 在 multipart/form-data 请求中的使用场景,在文章《SpringBoot 文件上传和下载(一)》有说明)

通过 HTTP 工具发送文件上传相关内容见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。

上一篇:SpringBoot 文件上传和下载(一)

下一篇:SpringBoot 文件上传和下载(三)

标签: #html上传大文件