『速查手册』MIME 多用途互联网邮件扩展

news2025/2/21 4:38:27

封面.png

『速查手册』MIME 多用途互联网邮件扩展

文章目录

  • 『速查手册』MIME 多用途互联网邮件扩展
    • 一、多用途互联网邮件扩展 / 互联网媒体类型
    • 二、MIME 命名规则😎
    • 三、MIME 类型列表🍉
        • 1)、Type 类型形式
        • 2)、Application 应用文件
        • 3)、Text 文本
        • 4)、Video 视频文件
        • 5)、Audio 数字音频
        • 6)、Image 图像
        • 7)、Message 邮件信息
        • 6)、Model 3D模型
        • 7)、multipart 复合信息
    • 四、Web开发使用Ajax下载文件流「实战场景」
        • 1)、使用 MIME 类型下载文件
        • 2)、在进行Web开发时,关于文件类型,你一定要知道:
    • 五、参考资料💘
    • 六、相关博文🍗


一、多用途互联网邮件扩展 / 互联网媒体类型

多用途互联网邮件扩展英语:Multipurpose Internet Mail Extensions,缩写:MIME)是一个互联网标准,它扩展了电子邮件标准,使其能够支持:非ASCII字符文本、非文本格式附件(二进位制、声音、图片等)等。
万维网中 HTTP 协议中也使用了 MIME 的框架,标准被扩展为
互联网媒体形式
,用于标识互联网上传输的内容类型,表示文档、文件或字节流的性质和格式,分类标准由互联网号码分配局IANA发布。1996年十一月,媒体类型在“RFC 2045”中被最初定义,当时仅被使用在SMTP协议的电子邮件中。
本文主要讲述的是互联网媒体类型(MIME-type)


二、MIME 命名规则😎

一个MIME类型包括一个类型(type),一个子类型(subtype),此外可以加上一个或多个可选参数(optional parameter),格式为类型名 / 子类型名 [; 可选参数],注意添加可选参数需要以分号分割,MIME 类型对大小写不敏感,但是传统写法都是全小写。
举个栗子text/plain; charset=UTF-8,文件类型为text文本,子类型代表着是纯文字内容,可选参数charset代表文本是以UTF-8编码的。

互联网媒体类型通常与文件拓展名相对应,计算机系统常常通过拓展名来确定一个文件的媒体类型并决定与其相关联的程序软件。


三、MIME 类型列表🍉

此部分正是速查手册发挥威力的地方,如果你正在查找的文件类型不存在这些示例里或文件类型比较特殊,那么在美国互联网号码分配局IANA官方MIME文档或是多伦多大学的学习文档里,可以看到最全的内容类型(Content-Type),希望能够帮助到你。

查阅时需要注意几点:

  • 对于一些应用程序,会有多个不同的扩展名,一般是新旧版本区别,比如微软的 Word、Excel、Powerpoint,在内容类型后会使用「」进行标识,使用时注意区别。
  • 使用application/octet-stream发送未知类型时,出于对资源内容安全考虑(可能是病毒),浏览器不允许设置一些自定义默认操作,需要用户存储到本地使用。
  • 尚未被接受为正式数据类型的子类型 subtype,一般会在名称前加上x-,列如:video/x-flv
  • MIME 根据 type 制定了默认的 subtype,当客户端不能确定 subtype 的情况下,将会使用默认的 subtype 进行处理。Text 默认是text/plain,Application 默认是application/octet-stream,Multipart 默认是multipart/mixed

1)、Type 类型形式

类型名描述
Text用于标准化地表示的文字消息,文字消息可以是多种字符集和或者多种格式
Multipart用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的资料
Application用于传输应用程序资料或者二进制资料
Message用于包装一个E-mail消息
Image用于传输静态图片资料
Audio用于传输音频或者音声资料
Video用于传输动态影像资料,可以是与音频编辑在一起的视频资料格式
Font用于传输字体文件
Model用于传输3D模型文件

2)、Application 应用文件

内容类型描述
application/ms-excel
application/vnd.ms-excel
application/x-msexcel
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 「.xlsx, .xlsm」
微软Excel电子表格
application/ms-powerpoint
application/vnd.ms-project
application/vnd.openxmlformats-officedocument.presentationml.presentation 「.pptx, .pptm」
微软PPT演示文档
application/msword
application/vnd.openxmlformats-officedocument.wordprocessingml.document 「.docx, .docm」
微软Word文档
application/pdf
application/x-pdf
PDF文档
application/rtf富文本文档
application/jsonJSON序列化数据
application/zipzip压缩包
application/gzipGzip压缩包
application/x-rar-compressedrar压缩包
application/x-7z-compressed7z、7zip压缩包
application/x-tartar归档包
application/octet-stream任意的二进制文件(通常做为通知浏览器下载文件),如果需要下载的文件不知道什么类型,不妨试试这个说不定有惊喜
application/oggOgg多媒体文件
application/atom+xmlAtom
application/xmlxml
application/xhtml+xmlXHTML
application/x-www-form-urlencoded超文本传输协议HTTP中Post请求的body格式之一,编码方式对于文件这种二进制的数据非常低效

3)、Text 文本

内容类型描述
text/plain纯文字内容
text/htmlHTML
text/cssCSS
text/javascriptjavascript
text/csvCSV文件
text/markdownMarkdown
text/xmlxml
text/vcardvCard电子名片

4)、Video 视频文件

内容类型描述
video/mpegMPEG-1视频文件
video/mp4MP4视频文件
video/oggOgg多媒体文件
video/quicktimeQuickTime视频文件
video/webmWebM视频文件
video/aviavi视频文件
video/x-matroskaMatroska多媒体封装格式
video/x-ms-wmvwmb视频文件
video/x-flvflv视频文件
video/x-matroskamkv视频文件

5)、Audio 数字音频

内容类型描述
audio/mp4MP4音频
audio/mpegMP3或其他MPEG音频
audio/oggOgg音频
audio/vorbisVorbis音频
audio/vnd.rn-realaudio
application/x-pn-realaudio
RealAudio音频
audio/vnd.wave
audio/x-wav
WAV音频
audio/webmWebM音频
audio/flacFLAC音频
audio/aacAAC音频

6)、Image 图像

内容类型描述
image/gifGIF图像文件
image/jpegJPEG图像文件
image/pngPNG图像文件
image/webpSVG向量图像文件
image/tiffTIFF图像文件
image/iconICO图片文件
image/bmpBMP图片文件

7)、Message 邮件信息

内容类型描述
message/rfc822RFC 822形式邮件
message/httpHTTP报文
external-body包含外部引用的消息
message/news包含新闻的消息

邮件类型参考资料较少,上诉描述可能存在不准确的情况,仅供参考。

6)、Model 3D模型

内容类型描述
model/example暂无信息
model/igesIGS文件、IGES文件
model/meshMSH文件,MESH文件
model/vrmlWRL文件,VRML文件
model/x3d+binary表示三维计算机图形的ISO标准,X3DB二进制文件
model/x3d+vrmlX3D ISO标准,表示三维计算机图形,X3DV VRML文件
model/x3d+xmlX3D ISO标准,表示三维计算机图形,X3D XML文件

7)、multipart 复合信息

内容类型描述
multipart/form-data超文本传输协议HTTP中Post请求的body格式之一,一般用于传输文件,编码方式相对高效
multipart/alternativeHTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示
multipart/mixed包含多个部分的消息

四、Web开发使用Ajax下载文件流「实战场景」

1)、使用 MIME 类型下载文件

在进行 Web 开发时,MIME 比较常用的场景在于上下传输文件(文件IO)以及用户在打开文件选择器时引导用户选择正确的文件类型
注意,在发起文件流资源请求若是缺少 MIME 类型或浏览器认为文件设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行 MIME 识别嗅探,每一个浏览器在不同的情况下会执行不同的操作。这会有文件识别错误的安全性问题,最好是自己在传输文件流的时候定义请求头Content-Type来设置正确的 MIME,阻止浏览器的 MIME 嗅探行为。
下述代码是下载文件的关键函数,主要依靠<a>标签的download属性,这个属性指示浏览器下载 URL 而不是导航到它,该属性的值将在下载保存过程中作为预填充的文件名。

/**
 * 文件下载函数
 * @param file File或则Blob对象
 * @param filename 文件名, 若未指定则尝试使用file对象name属性
 */
function downloadFile(file, filename) {
  const aEle = document.createElement("a");
  const fileUrl = URL.createObjectURL(file);
  aEle.id = `__download_${Math.random() * 100000}`;
  aEle.style.display = "none";
  aEle.href = fileUrl;
  aEle.download = filename ?? file.name;
  document.body.appendChild(aEle);
  aEle.click();
  document.body.removeChild(aEle);
  URL.revokeObjectURL(fileUrl);
}

来看看下载工作原理,在下述代码里编写一个简单的 markdown 文档内容,并使用浏览器将其下载。
File(bits, name[, options])接口提供有关文件的信息,并允许网页中的 JavaScript 访问其内容,bits参数接受一个ArrayBufferArrayBufferViewBlob,或者String对象的Array或者任何这些对象的组合。

// 不指定后缀, 则File.type属性识别文件类型
let fileName = "基本的客户联系人列表.md";
const data = `
# Markdown
- Markdown是一种轻量级标记语言,创始人为约翰·格鲁伯。它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档。[4]这种语言吸收了很多在电子邮件中已有的纯文本标记的特性
- 由于Markdown的轻量化、易读易写特性,并且对于图片,图表、数学式都有支持,目前许多网站都广泛使用Markdown来撰写帮助文档或是用于论坛上发表消息。如GitHub、Reddit、Discord、Diaspora、Stack Exchange、OpenStreetMap 、SourceForge、简书等,甚至还能被用来撰写电子书。
`
const file = new File([data], fileName, {
  // 指定后缀去情况下,type属性失效
  type: "text/markdown"
});
downloadFile(file);

当然,在绝大多数下载文件的场景中,不会只下载一个写死在代码且内容有限的文件,往往都是通过 Ajax 向服务器请求文件流资源再到用户浏览器中下载。
编写一个请求函数,并通过 Ajax 下载一个 Excel 表格模板。值得一提的是,除非文件是简单的文本内容,在大多数情况下都是以文件流进行传输,也就是二进制数据,在保存响应时一定要将其定义成二进制数据类型。

/**
 * 请求函数
 * @param url 请求地址
 * @param config 请求配置项
 * @return {Promise<never>|Promise<unknown>}
 */
function request(url, config = {}) {
  if (config.constructor !== Object) {
    return Promise.reject("请求配置应为对象");
  }

  const {headers, method = "GET", responseType = "json", data} = config;
  const textType = ["text", "json"];

  return new Promise((resolve, reject) => {
    const xml = new XMLHttpRequest();
    xml.open(method, url);
    xml.onreadystatechange = () => {
      if (xml.readyState === XMLHttpRequest.DONE
        && xml.status === 200) {
        // 请求类型影响响应数据
        let responseData = !responseType || textType.includes(responseType)
          ? xml.responseText : xml.response;
        // Json类型尝试解析
        if (/^json$/.test(responseType)) {
          try {
            responseData = JSON.parse(responseData);
          } catch {}
        }
        resolve({
          data: responseData,
          status: xml.status,
          statusText: xml.statusText,
          headers,
          config,
          request: xml
        });
      }
    };

    xml.onerror = () => {
      reject({
        code: "ERR_NETWORK",
        status: xml.status,
        config,
        request: xml
      });
    };

    // 向请求中添加请求头
    if (headers && headers.constructor === Object) {
      for (const [key, value] of Object.entries(headers)) {
        xml.setRequestHeader(key, value);
      }
    }

    // 如果需要,向请求添加responseType
    if (responseType && responseType !== "json") {
      xml.responseType = responseType;
    }

    xml.send(data);
  });
}

/**
 * 文件下载函数
 * @param file File或则Blob对象
 * @param filename 文件名, 若未指定则尝试使用file对象name属性
 */
function downloadFile(file, filename) {
  const aEle = document.createElement("a");
  const fileUrl = URL.createObjectURL(file);
  aEle.id = `__download_${Math.random() * 100000}`;
  aEle.style.display = "none";
  aEle.href = fileUrl;
  aEle.download = filename ?? file.name;
  document.body.appendChild(aEle);
  aEle.click();
  document.body.removeChild(aEle);
  URL.revokeObjectURL(fileUrl);
}

async function execute() {
  const {data} = await request(
    "https://content-prod.officeplus.cn/cms/6d719064-76b5-bd33-fa6d-3a067ae39e28.xlsx?sv=2021-06-08&se=2023-01-17T12%3A43%3A43Z&sr=b&sp=r&sig=PUk8TqTzWZNFCmvdY9Cnkn01EQSDf8yZLH3LqVRfZBg%3D",
    {
      // 二进制文件对象
      responseType: "arraybuffer"
    });
  // 不指定后缀, 则File.type属性识别文件类型
  let fileName = "基本的客户联系人列表";
  const file = new File([data], fileName, {
    // 指定后缀去情况下,type属性失效
    type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    // 老版本xls,MIME浏览器无法自动识别
    // type: "application/ms-excel"
  });
  downloadFile(file);
}

execute();

看到这里,相信你已经掌握了如何根据 MIME 类型在Web开发中下载文件,不妨多多尝试。

2)、在进行Web开发时,关于文件类型,你一定要知道:

  • 在大多数浏览器里,基于文件扩展来假设文件类型,如果在为文件命名时指定了后缀,那么在FileBlob设置的type属性 MIME 值将失效,将根据文件名的后缀进行保存。
  • 假如文件名指定为 deam.txt,但实际上为 PNG 图像文件类型,type属性值给定_image/png_,但这样并不会重新更改为 deam.png 文件,依旧为_text/plain_类型。
  • 使用FileBlobtype属性仅仅对常见文件类型可靠,例如图像、文档、音频和视频,不常见的 MIME 类型会返回空字符串,造成保存的文件没有后缀,如老式 Office 文档.xls文件使用application/ms-excel并不能识别。开发者最好不要依靠这个属性,作为唯一的验证方案。

MIME 类型不仅仅在Web开发中使用,在其他用途上能经常看到其身影,这是一个很通用且伟大的标准。


五、参考资料💘

🍅因发布平台差异导致阅读体验不同,源文贴出:《『速查手册』MIME 多用途互联网邮件扩展》

  • 维基百科中文版:
    • 多用途互联网邮件扩展
    • 互联网媒体类型
    • Office Open XML
  • 官方手册:
    • MDN 标签
    • MDN File 对象
    • MDN MIME 类型
    • 美国互联网号码分配局 MIME 文档
    • 多伦多大学 MIME 文档

六、相关博文🍗

  • 『精』EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elasticsearch(三)-- 理解ES的索引操作

一、前言 上一章我们主要学习了es的几个客户端&#xff0c;那么我们后面也主要通过kibana客户端、HighLevelClient高级客户端这两个来学习es. 这一章的学习我们主要是学习一些Elasticsearch的基础操作&#xff0c;主要是深入一些概念&#xff0c;比如索引的具体操作&#xff0…

三、WEB框架介绍以及设计模式

web框架介绍 什么是web框架 应该叫web应用框架(web application framework)&#xff0c;它是一种开发框架。 通俗点来讲&#xff0c;就是用来开发web应用的程序。 为什么要使用框架来开发 互联网行业流行一句话叫“不要重复造轮子”&#xff0c;特别是对于新手和应用层开发…

day22-JDK新特性

接口中的新特性 接口我们之前已经学过了&#xff0c;那么接口中内部主要就是封装了方法&#xff0c;包含抽象方法&#xff08;JDK 7及以前&#xff09;&#xff0c;默认方法和静态方法&#xff08;JDK 8&#xff09;&#xff0c;私有方法 &#xff08;JDK 9&#xff09;。 接口…

使用Navicat导入和导出sql语句

创建mysql数据库 创建数据库之前&#xff0c;肯定要先连接上数据库&#xff0c;如果不知道怎么使用navicat连接mysql数据库&#xff0c;可以参考之前的文章哦 https://blog.csdn.net/weixin_43860634/article/details/128716733 接下来进入正题 1、首先要双击test &#xff0…

命令注入与dvwa中的Command Injection

一、什么是命令注入&#xff1f;即 Command Injection&#xff0c;是指通过提交恶意构造的参数破坏命令语句结构&#xff0c;从而达到执行恶意命令的目的。此攻击与代码注入不同&#xff0c;因为代码注入允许攻击者添加自己的代码&#xff0c;然后由应用程序执行。 在命令注入中…

用队列实现栈

题目&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;准备工作这题明确说明了需要用队列来实现栈&#xff0c;介于C语言没有队列的库&#xff0c;所以在此之前我们需要用调用之前学的队列&#xff0c;详见队列typedef int QDataType;typedef struct Queu…

Ubuntu上安装 Hadoop 3详细过程(验证+填坑总结)

Ubuntu上安装 Hadoop 3 前提条件&#xff1a; Python 推荐3.8JDK 推荐1.8 解压安装 sudo tar -zxvf hadoop-3.3.0.tar.gz -C /usr/local cd /usr/local sudo mv hadoop-3.3.0 hadoop sudo chown -R hadoop ./hadoop 配置环境变量 vim ~/.bashrc # hadoop export H…

云原生安全系列 5:ETCD 安全加固

引言 etcd是一个强一致性的分布式键值存储&#xff0c;它提供了一种可靠的方式来存储需要被分布式系统或机器集群访问的数据。通过 raft 算法它能在网络分区期间优雅地处理领导者的选举&#xff0c;并能容忍机器故障&#xff0c;甚至在领导者节点上。除此之外&#xff0c; etc…

存储过程的基础知识

本文来简单说下存储过程的基础知识 文章目录概述什么是存储过程存储过程的优缺点概述 mysql官网提供的储存过程&#xff1a;https://www.mysqlzh.com/doc/225/499.html 什么是存储过程 简单的说&#xff0c;存储过程是一条或者多条SQL语句的集合&#xff0c;可视为批文件&…

Windows下更改yarn的安装位置,减小C盘占用

Windows下更改yarn的安装位置&#xff0c;减小C盘占用 绷不住了&#xff0c;yarn的C盘占用太高了&#xff0c;我这C盘感觉以后会受不了&#xff0c;太大了~~&#xff08;捂脸~~ nnd&#xff0c;撸他&#xff0c;更改yarn的位置开始&#xff01; 先看看yarn目前的位置 检查当前…

「自控原理」2.4 信号流图与梅逊公式、闭环传递函数

本节引入了信号流图以及梅逊增益公式&#xff0c;可以据此快速对系统进行化简 本节引入了闭环传递函数的概念&#xff0c;并介绍了常用的闭环传递函数 文章目录信号流图的基本概念信号流图与方框图的关系从结构图绘制信号流图从信号流图绘制结构图梅逊(Mason)增益公式Mason公式…

Workfine5.0扩展功能——如何识别身份证信息?

哈喽&#xff0c;我是办公助手小W&#xff0c;又到了跟大家分享办公小技巧的时候啦&#xff01; 最近Workfine5.0最新版本上线后&#xff0c;大家最感兴趣的就是它的扩展功能了&#xff0c;今天要跟大家分享的就是如何实现身份证信息的提取。 首先咱们先要知道如何下载安装扩…

(第五章)OpenGL超级宝典学习:缓冲

缓冲 前言 本篇在讲什么 关于OpenGL数据缓冲的相关内容 本篇适合什么 适合初学OpenGL的小白 想了解OpenGL缓冲对象的同学 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文…

使用OpenCV透视变换技术实现坐标变换实践

1. 概述 1.1. 需求 在局部空间&#xff08;无GPS定位&#xff09;视频监控过程中&#xff0c;把视频识别到物体位置&#xff0c;投射到空间平面坐标系中&#xff0c;获取物体在局部空间的平面坐标。 1.2. 解决方案 使用图像透视变换技术。 1.3. 透视变换概念 透视变换是指…

链路追踪组件Skywalking使用

前言Skywalking是一个国产开源框架&#xff0c;2015年由吴晟开源 &#xff0c; 2017年加入Apache孵化器&#xff0c;其用于追踪多微服务模块调用之间日志的追踪&#xff0c;协助程序员进行排除问题Skywalking架构Skywalking架构图大概如下SkyWalking OAP&#xff1a; SkyWalkin…

如何格式化U盘?以及优盘格式化的恢复方法

我们经常使用U盘来进行存储和传输数据&#xff0c;使用时间久了&#xff0c;可能需要我们进行优盘格式化。需要注意&#xff01;优盘格式化之前&#xff0c;记得对里面的数据进行备份&#xff0c;防止数据清空造成不必要的损失。 如何进行U盘格式化&#xff1f;格式化优盘后&a…

“深度学习”学习日记。误差反向传播法--加法层、乘法层、激活函数层的实现

2023.1.16 1、加法层、乘法层&#xff1a; 前两篇文章都在讲述理论&#xff0c;今天实现代码操作&#xff1a;关于加法节点&#xff0c;乘法节点的内容在这篇文章。 https://blog.csdn.net/m0_72675651/article/details/128695488 在以后的学习中&#xff0c;将把构建神经网…

AHOcoder声码器

AHOcoder声码器 目前最常见的声码器有WORLD&#xff0c;STRAIGHT&#xff0c;&#xff27;riffin_Lim等&#xff0c;AHocoder算是少见的&#xff0c;但也可以学习一下。 代码下载网址&#xff1a;AHOcoder 简介 AHOcoder 语音声码器由 Daniel Erro 在巴斯克大学的 AHOLAB 信…

若依配置教程(一)运行若依系统

一、下载源代码 若依的源代码是开源的&#xff0c;所以我们在若依的官方网站即可进行下载&#xff0c;若依的官网是&#xff1a;http://doc.ruoyi.vip/ruoyi-vue/&#xff0c;进入官网后&#xff0c;会显示代码下载的地址&#xff1a;https://gitee.com/y_project/RuoYi-Vue&a…

【进阶】Bean作用域和生命周期

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、通过⼀个案例来看 Bean 作⽤域的问题1. 被修改的Bean案例2. 原因分析二、作用域Scope定义1. Bean的六种作用域&#xff08;重点&#xff09;1&#xff09;singleton2&#xff09;prototype3&#xff09;request4…