SpringBoot文件上传和下载(二)
在上一篇文章《SpringBoot 文件上传和下载(一)》中,我们简绍了 HTTP 中关于 MIME 类型、HTTP Header Content-Type 和 Content-Disposition 的内容。
在本篇和后续篇章中正式开始学习一下 SpringBoot 中文件上传的知识,测试的场景分为三类:通过 HTML 页面上传文件通过 Jmeter、Postman、IDEA HTTP Client 工具上传通过 SpringBoot 服务上传
本篇学习如何通过 HTML 页面上传文件 创建 HTML 页面
我们先简单写一个用于上传文件的 HTML 页面,效果如下:
测试文件上传 创建 SpringBoot 微服务
创建 SpringBoot 微服务,创建用于测试文件上传的 Controller,如下所示:@Slf4j @RestController public 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 必须为 post Controller 中的注意点在本次示例中,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 工具发送文件上传相关内容见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。