MIMEIETF RFC 6838 (Multipurpose Internet Mail Extensions)是一种标准,用来表示文档、文件或字节流的性质和格式。
《HTTP 头字段 Content-Type 是什么》
随便打开一个网站,通过控制台可以看到网页在完成渲染之前向 Web 服务器请求大量的资源,这些资源有图片、音频、视频、CSS、JavaScript。为了区别资源类型,给 HTTP 头字段 Content-Type 添加 MIME,以便于浏览器以正确的方式处理它们。
给 HTTP 头字段 Content-Type 添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会曲解文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。
如上图,请求 eva.png 的 HTTP 的响应头字段 "content-type: image/png",代表图片资源是一个 .png 格式的图片。
MIME 的组成结构非常简单,由类型与子类型两个字符串中间用 "/" 分隔而组成。"type" 表示可以被分多个子类的独立类别;"subtype" 表示细分后的每个类型。
type/subtype
有 TEXT(文本)、IMAGE(图像)、AUDIO(音频)、VIDEO(视频)、APPLICATION(应用程序)这五种独立媒体类型。
独立媒体类型 | 主类型 | RFC 定义 | 子类型 |
---|---|---|---|
TEXT | 表明是某种文本文件 | RFC 6838 - 4.2.1 | text/plain, text/html, text/css |
IMAGE | 表明是某种图像文件 | RFC 6838 - 4.2.2 | image/gif, image/png |
AUDIO | 表明是某种音频文件 | RFC 6838 - 4.2.3 | audio/midi, audio/mpeg |
VIDEO | 表明是某种视频文件 | RFC 6838 - 4.2.4 | video/webm, video/ogg |
APPLICATION | RFC 6838 - 4.2.5 |
上面五个独立媒体类型要求内容只能其中一种独立媒体类型,不可以包含多独立媒体类型;而 MULTIPARTRFC 6838 - 4.2.6可以让内容包含多种独立媒体类型,所以它是符合媒体类型。
MULTIPART 的子类型通常是 "form-data",即 "multipart/form-data"。它通常用来上传文件时所使用的一种 MIME 类型。
《FormData 是什么?附多文件上传案例》
怎么才体现出它是符合媒体类型?
let formData = new FormData(); // 可多选文件 for (let index in this.files) { formData.append(`files`, this.files[index]); } // 添加两个非文件的数据 formData.append('name', this.user.name); formData.append('sex', this.user.sex);
用 axios 发送 formData 给 Web 服务器:
axios.post('http://localhost:8080/upload', formData, { headers: { 'content-type': 'multipart/form-data' } });
API 接口:
@RequestMapping(value = "/upload", consumes = "multipart/form-data") public void upload(@RequestParam("name") String name, @RequestParam("sex") String sex, @RequestParam("files") MultipartFile[] files) { System.out.println("{ sex: " + name + ", sex: " + sex + " }"); for (MultipartFile file : files) { System.out.println(file.getOriginalFilename()); } }
复合类型 multipart 允许存在多种媒体类型,有文本类型以及文件,并且能够成功地接收这些数据。