Base64 Data URI
解析 Data URI 提取 MIME、大小和预览;或从 MIME Type + Base64 生成完整 Data URI。
什么是 Data URI?
Data URI(也叫 Data URL)是一种 URI 格式,它把文件的完整内容直接写进 URI 字符串里,而不是指向一个外部文件地址。这样,图片、字体、PDF 等任何文件都可以内嵌在 HTML、CSS 或 JSON 中,无需额外的 HTTP 请求。
Data URI 由 RFC 2397 定义,所有现代浏览器均支持,也是 HTML 邮件嵌入图片的标准方案之一。
Data URI 语法
| 部分 | 是否必须 | 说明 |
|---|---|---|
| data: | 必须 | 固定前缀,声明这是一个 Data URI |
| mediatype | 可选 | MIME Type,如 image/png。省略时默认为 text/plain;charset=US-ASCII |
| ;base64 | 可选 | 声明数据为 Base64 编码。省略时数据以 URL 编码的文本形式出现 |
| , | 必须 | 分隔符,头部与数据之间的边界 |
| data | 必须 | 实际内容,Base64 字符串或 URL 编码文本 |
典型示例
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48Y2lyY2xlIG…data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==data:text/html;base64,PCFET0NUWVBFIGh0bWw+PGh0bWw+PGJvZHk+PGgxPkhlbGxvPC9oMT48L2JvZHk+PC9odG1sPg==什么时候用,什么时候不用
适合用 Data URI
- 小图片内嵌到 CSS / HTML(< 5 KB)
- HTML 邮件中嵌入图片
- @font-face 内联小字体
- favicon 直接写在 <link>
- JSON API 传递小附件
- 单文件 HTML 需要自包含资源
不适合用 Data URI
- 大文件(> 10 KB),体积膨胀明显
- 需要被浏览器独立缓存的资源
- 多个页面共用的图片(缓存失效)
- 需要 CDN 分发或懒加载
- 大量图片(每个都内联会撑大 HTML)
- 需要服务端流式传输的场景
常见问题
什么是 Data URI?
Data URI 是一种将文件数据直接写进 URL 字符串的格式,格式为 data:[mime][;base64],[数据]。它让图片、字体、文本等资源可以内嵌在 HTML、CSS 或 JSON 中,不需要额外的 HTTP 请求。
Data URI 和普通 URL 的区别是什么?
普通 URL(如 https://example.com/image.png)是指向外部资源的指针,浏览器需要发请求获取内容。Data URI 直接包含内容本身,不需要网络请求,但也无法被独立缓存。
Data URI 可以用在 HTML 邮件中吗?
可以,而且是 HTML 邮件嵌入图片的常用方案。很多邮件客户端默认屏蔽外部图片,但 Data URI 把图片内嵌在邮件 HTML 里,不依赖外部请求,可以确保图片始终显示。缺点是邮件体积会增大。
为什么 Data URI 不能被浏览器缓存?
Data URI 是 HTML/CSS 文档的一部分,浏览器缓存的是包含它的整个文档,而不是 Data URI 本身。如果多个页面都用同一张图片,用外部 URL 只需下载一次,而 Data URI 每个页面都需要包含一份。
如何从 Data URI 中提取 MIME Type?
Data URI 格式为 data:[mime];base64,[data],取 data: 和第一个 ; 或 , 之间的部分就是 MIME Type。例如 data:image/png;base64,xxx 的 MIME Type 是 image/png。
没有 ;base64 的 Data URI 是什么格式?
如果省略 ;base64,数据部分是 URL 编码的文本,而不是 Base64。例如 data:text/html,<h1>Hello</h1> 是一个合法的 Data URI(浏览器会 URL 解码后渲染)。这种格式只适合文本内容,二进制文件必须用 Base64。