响应头中的 content-type 字段标识了响应数据的类型,响应的数据可能是普通文档(例如HTML文档、JSON数据等)、文件或者字节流等格式。响应数据的类型被称之为 MIME类型 (Multipurpose Internet Mail Extensions),它是一种标准,用来规范响应数据的性质和格式。浏览器通过响应的 MIME 类型来确定如何处理响应数据,如果服务器配置的 MIME 类型不正确,可能会导致浏览器不能正确处理响应数据。
MIME类型(即响应头中的 content-type 字段)的格式为 TYPE/SUB_TYPE
,不允许空格,大小写不敏感。浏览器不会自动识别文件类型,而是通过 MIME 类型简单判断,例如将一个 css 文件的 MIME 类型设为 text/plain,浏览器不会将其视为一个有效的 css 文件;一个被浏览器识别的有效 css 文件需要使用 text/css 类型。
TYPE 的取值可以是:
- text 普通文本,可以直接在浏览器中查看和读取
- image 图像文件,包括动态图,不包括视频
- audio 音频文件
- video 视频文件
- application 某种二进制数据
- multipart 一种特殊的类型
重要的 MIME 类型
文本文件
常见文本文件类型:
- text/plain 未知的文本文件类型(文本文件默认类型),浏览器可以直接展示
- text/html HTML 内容
- text/javascript JavaScript 文件
图像文件
安全的图像文件类型:
- image/gif
- image/jpeg
- image/png
- image/svg+xml
image/webp 尚未被添加到标准中。
浏览器还额外支持一些其他的图片类型,例如 image/x-icon 表示 ICO 图片。
image/vnd.microsoft.icon 虽然在标准里注册了,但是大家不怎么用它,而是使用 image/x-icon。
音频和视频文件
- audio/wave
- audio/wav
- audio/x-wav
- audio/x-pn-wav
- audio/webm
- video/webm
- audio/ogg
- video/ogg
- application/ogg
- application/json ???
一般二进制文件
- -12pxapplication/octet-stream 二进制文件默认类型,未知的二进制文件
文件流响应的处理
后台发送了一个文件流到前端,如果没有指定 MIME 类型,则使用默认的 application/octet-stream 类型。
前端接收到的响应内容是二进制数据,该数据不能像文本数据一样,在浏览器开发工具中直接查看。
可以将流数据保存到 Blob 对象中:
const blob = new Blob(someStreamData)
// 可以指定数据类型
const blob = new Blob(someStreamData, { type: "application/pdf" })
Blob 对象可以导出到客户端本地:
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
评论区