Data URLs

2019/05/22 计算机网络

语法

Data URLs,即前缀为data:协议的 URL,其允许内容创建者向文档中嵌入小文件。

Data URLs 由四个部分组成:前缀(data:)、指示数据类型的 MIME 类型、如果非文本则为可选的base64标记、数据本身:

data:[<mediatype>][;base64],<data>

mediatype是 MIME 类型的字符串,例如image/png表示 PNG 图像文件。如果省略,则默认值为text/plain;charset=US-ASCII

如果数据是文本类型,可以直接将文本嵌入(根据文档类型,使用合适的实体字符或转义字符)。如果是二进制数据,可以将数据进行 base64 编码之后再进行嵌入,并且以数据前加上;base64表明编码。

以下是一些示例:

Data URLs 说明
data:,Hello%2C%20World! 简单的 text/plain 类型数据
data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D 上一条示例的 base64 编码版本
data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E 一个 HTML 文档源代码 <h1>Hello, World</h1>
data:text/html,<script>alert(‘hi’);</script> 一个会执行 JavaScript alert 的 HTML 文档。注意 script 标签必须封闭

使用 Go 语言生成 base64 编码数据

Data URLs 常用于图片中,把一些小尺寸图片转为 Data URLs 可以减少 HTTP 请求,但对于大尺寸图片不建议转换。以下是 Go 语言生成 base64 编码格式图片的示例:

package main

import (
    "encoding/base64"
    "os"
    "log"
    "bytes"
    "io"
)

func main() {
    reader, err := os.Open("./practice/images/test.png")
    if err != nil {
        log.Fatal(err)
    }
    defer reader.Close()

    var buf bytes.Buffer
    var b = make([]byte, 1024)
    for {
        n, err := reader.Read(b)
        if err != nil {
            if err == io.EOF {
                buf.Write(b[:n])
                break
            }
            log.Fatal(err)
        }

        n, err = buf.Write(b[:n])
        if err != nil {
            log.Fatal(err)
        }
    }

    writer, err := os.OpenFile("./test.html", os.O_CREATE|os.O_RDWR,0644)
    if err != nil {
        log.Fatal(err)
    }
    defer writer.Close()

    writer.WriteString("<img src='data:image/png;base64,")
    encoder := base64.NewEncoder(base64.StdEncoding, writer)
    encoder.Write(buf.Bytes())
    encoder.Close()
    writer.WriteString("'>")
}

以上代码对./practice/image/test.png中的内容进行 base64 编码,并输出到./test.html文件中。浏览器打开 test.html 文件即可看到效果。

常见问题

语法

Data URLs 的格式很简单,但很容易会忘记data:[<mediatype>][;base64],<data>中的<data>前面是有,的。

HTML 代码格式化

Data URLs 是文件中的文件,相对文档来说这个文件可能非常长。因为 Data URLs 也是 URL,所以 data 会用空白符来对它进行格式化。但如果数据是经过 base64 编码的,就可能会遇到一些问题

长度限制

缺乏错误处理

Data URLs 无法被解析时不会有任何相关提示。

不支持查询字符串

data:text/html,lots of text...<p><a name%3D"bottom">bottom</a>?arg=val

这个 Data URL 代表的 HTMl 源文件内容为:

lots of text...<p><a name%3D"bottom">bottom</a>?arg=val

本文整理自 Data URLs

Search

    Table of Contents