细说 Data URI

细说 Data URI

2015/08/27 · HTML5 ·
URI

原文出处:
李靖(@Barret李靖)   

Data URL 早在 1995 年就被提出,那一个时候有无数个本子的 Data URL Schema
定义陆续出现在 VRML 之中,随后赶忙,其中的一个版本被提上了议案——将它做个一个嵌入式的资源放置在
HTML
语言之中。从 RFC 文档定稿的年华来看(1998年),它是一个很受欢迎的阐明。

Data URIs 定义的始末能够看做小文件被插入到其余文档之中。URI
是 uniform resource identifier 的缩写,它定义了接受内容的情商以及附带的连带内容,如果附带的连锁内容是一个地方,那么此时的
URI 也是一个 URL (uniform resource locator),如:

ftp://10.1.1.10/path/to/filename.ext

1
2
ftp://10.1.1.10/path/to/filename.ext
http://example.com/source/id

协和前面的情节,可以告知客户端一个准儿下载资源的地方,而 URI
并不一定包罗一个地点音讯,如(demo):

data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7

1
data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7

其情商为
data,并告知客户端将这几个情节作为 image/gif 格式来分析,必要分析的始末使用的是
base64 编码。它一向包涵了情节但并不曾一个规定的资源地址。

图片 1

【新增】:

Data URL 早在 1995
年就被提议,那多少个时候有那个个版本的 Data URL Schema 定义陆续出现在
VRML
之中,随后赶忙,其中的一个本子被提上了议案——将它做个一个嵌入式的资源放置在
HTML 语言之中。从 RFC
文档定稿的时日来看(1998年),它是一个很受欢迎的注脚。

  后天在用一个croppic的jQuery裁剪图片的插件的时候,发现在后台获取图片时,无法通过Request.File获取了,不过通过Request.Form[]可以。用firebug跟了一晃发现,图片传输的数码不是一个文件流的样式进行提交的,而是一个表单元素,如下图所示:

☞ 格式

Data URI 的格式非凡不难,如下所示:

  • 先是有些是 data: 协议头,它标识那个内容为一个 data URI 资源。
  • 第二有些是 MIME
    类型,表示这串内容的表现格局,比如:text/plain,则以文件类型呈现,image/jpeg,以
    jpeg 图片形式浮现,同样,客户端也会以那么些 MIME 类型来分析数据。
  • 细说 Data URI。其三有的是编码设置,默许编码是 charset=US-ASCII,
    即数据部分的各类字符都会自动编码为 %xx,关于编码的测试,可以在浏览器地址框输入分别输入上面两串内容,查看效果:

// output: ä½ å¥½ -> 使用默许的编码浮现,故乱码 data:text/html,你好
// output: 你好 -> 使用 UTF-8 显示 data:text/html;charset=UTF-8,你好
// output: 浣犲ソ -> 使用 gbk 显示(浏览器默许编码 UTF-8,故乱码)
data:text/html;charset=gbk,你好 // output: 你好 -> UTF-8
编码,内容先接纳 base64 解码,然后展示data:text/html;charset=UTF-8;base64,5L2g5aW9

1
2
3
4
5
6
7
8
// output: ä½ å¥½ -> 使用默认的编码展示,故乱码
data:text/html,你好  
// output: 你好 -> 使用 UTF-8 展示
data:text/html;charset=UTF-8,你好
// output: 浣犲ソ -> 使用 gbk 展示(浏览器默认编码 UTF-8,故乱码)
data:text/html;charset=gbk,你好
// output: 你好 -> UTF-8 编码,内容先使用 base64 解码,然后展示
data:text/html;charset=UTF-8;base64,5L2g5aW9
  • 第四局地是 base64 编码设定,那是一个可选用,base64
    编码中仅包涵 0-9,a-z,A-Z,+,/,=,其中 = 是用来编码补白的。
  • 最后一有的为这几个 Data URI
    承载的内容,它可以是纯文本编写的情节,也得以是通过 base64编码
    的始末。

洋洋时候大家运用 data URI
来展现一些较长的始末,如一串二进制数据编码、图片等,选拔 base64
编码可以让内容变得更其简明。而对图纸来说,在 gzip 压缩之后,base64
图片实际上比原图 gzip
压缩要大,体积增添大概为三分之一,所以使用的时候要求权衡。

引子:在研商File里德r时,有个方法readAsDataURL;然后看到打印出来的事物类似于如下:【data:text/plain;base64,Y29tZSBvbiB0byBidXkgYSBwaWFubyE=】,那些事物居然像个超链接一样可以跳转,在新窗口中浮现出文档内容,假使是图形还会显得出图片。于是相比较奇怪这是什么样定位到图片的职位的,原来这串字符并从未一定图片地点,而是将图纸的情节一向包蕴了进来,所以浏览器就一向解析出来了。具体用法见如下作品

Data URIs 定义的始末可以看成小文件被插入到其余文档之中。URI 是
uniform resource identifier
的缩写,它定义了接受内容的商事以及附带的连带内容,即便附带的连锁内容是一个地址,那么此时的
URI 也是一个 URL (uniform resource locator),如:

  图片 2

☞ 兼容性

出于出现时间较早,方今主流的浏览器基本都匡助 data URI:

  • Firefox 2+
  • Opera 7.2+
  • Chrome (所有版本)
  • Safari (所有版本)
  • Internet Explorer 8+

不过有的浏览器对 data URI 的行使存在限制:

  • 长度限制,长度超长,在一部分采用下会促成内存溢出,程序崩溃

Opera 下限制为 4100 个字符,如今已经去掉了那几个限制 IE 8+ 下限制为 32,768
个字符(32kb),IE9 之后移除了那几个界定

1
2
Opera 下限制为 4100 个字符,目前已经去掉了这个限制
IE 8+ 下限制为 32,768 个字符(32kb),IE9 之后移除了这个限制
  • 在 IE 下,data URI 只允许被用到如下地方:
    • object (images only)
    • img、input type=image、link
    • CSS 中允许选择 URL 申明的地点,如 background
  • 在 IE 下,Data URI 的始末必须是透过编码转换的,如 “#”、”%”、非
    US-ASCII 字符、多字节字符等,必须通过编码转换

☞ 低版本IE的解决之道 – MHTML

MHTML 就是 MIME HTML,是 “Multipurpose Internet Mail Extensions
HyperText 马克up Language”
的简称,它就像是一个带着附件的邮件一般,如下所示:

/** FilePath: */ /*!@ignore
Content-Type: multipart/related; boundary=”_ANY_SEPARATOR”
–_ANY_SEPARATOR Content-Location:myidBackground
Content-Transfer-Encoding:base64
iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==
–_ANY_SEPARATOR– */ .myid { background-image:
url(“data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==”);
*background-image:
url(mhtml:); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/** FilePath: http://example.com/test.css */
/*!@ignore
Content-Type: multipart/related; boundary="_ANY_SEPARATOR"
 
–_ANY_SEPARATOR
Content-Location:myidBackground
Content-Transfer-Encoding:base64
 
iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==
–_ANY_SEPARATOR–
*/
 
.myid {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==");
  *background-image: url(mhtml:http://example.com/test.css!myidBackground);
}

上边的一串注释就好像一个附件,那么些附件内容是一个称作 myidBackground 的
base64 编码图片,在一个 class 叫做 myid 的 css
中用到了它。那里有几点要求注意:

  • _ANY_SEPARATOR 可以是即兴内容
  • 在”附件”截止地点需求加上得了符 _ANY_SEPARATOR,否则在 Vista 和
    Win7 的 IE7
    中会出错。
  • 附件代码注意不要被压缩工具给干掉了

此间存在一个坑:部分系统匹配方式下的 IE8 也认识 css 中的 hack
符号 *,但是不协助 mhtml,所以地方的内容不会收效。处理方案臆想就只有利用
IE 的尺码注释了。

摘自: 

ftp://10.1.1.10/path/to/filename.ext
http://example.com/source/id

 经过一番度娘后,学习了新知识,原来是浏览器通过Data
URI scheme 把图纸选拔base64编码把图纸数据翻译成标准的ASCII字符。

☞ HTTPS 下的平安提示

HTTPS 打开页面,当在 IE6、7 下行使 data URIs 时,会看到如下提示:

图片 3

MS 的演讲是:

您正在查看的网站是个平平安安网站。它使用了 SSL (避孕套接字层)或
PCT(保密通信技术)那样的平安磋商来确保您所收发音信的安全性。
当站点使用安全协议时,您提供的音信例如姓名或信用卡号码等都经过加密,其余人不能读取。但是,这一个网页同时涵盖未利用该安全磋商的档次

很分明,IE 嗅到了”未利用安全协议的品类”。

浏览器在解析到一个 URI
的时候,会首先判断协议头,若是是以 http(s) 开始,它便会树立一个网络链接下载资源,若是它发现协议头为 data:,便会将其当作一个
Data URI 资源开展剖析。

图片 4

只是从 chrome 的瀑布流,我们可以做这么的揣度:

图中每个 Data URI
都提倡了请求,可是景况都是 data(from cache),禁用缓存之后,照旧那样。所以可以判定,浏览器在下载源码解析成
DOM 的时候,会将 Data URI 的资源解析出来,并缓存在地面,最终 Data URI
每个对应地方都会发起五遍呼吁,只是这些请求还未建立链接,就被发现存在缓存的浏览器给拍死了。

Data URL 早在 1995
年就被提议,那一个时候有诸四个本子的 Data URL Schema
定义陆续出现在 VRML 之中,随后不久,其中的一个版本被提上了议案——将它做个一个嵌入式的资源放置在
HTML
语言之中。从 RFC 文档定稿的时刻来看(1998年),它是一个很受欢迎的发明。

研商前面的始末,可以告知客户端一个精确下载资源的地址,而 URI
并不一定包涵一个地址音讯,如(demo):

 在地方的Data
URI中,data表示收获数据的协定名称,image/png 是数据类型名称,base64
是多少的编码方法,逗号后边就是以此image/png文件base64编码后的数量。

☞ 安全阀门

Data URI 在 IE 下有诸多安然无恙限制,事实上,很多 xss 注入也足以将 data URI
的源头作为入口,使用 data URI 绕过浏览器的过滤。

JavaScript

// 绕过浏览器过滤
src=”data:text/html,<script>alert(“Xss”)</script><!–

1
2
// 绕过浏览器过滤
http://example.com/text.php?t="><script src="data:text/html,<script>alert("Xss")</script><!–

那边可以很大程度的疏散,很有意思,值得读者去探索。

Data URIs
定义的始末可以看做小文件被插入到其余文档之中。URI
是 uniform resource identifier(统一资源标识符) 的缩写,它定义了接受内容的协议以及附带的相关内容,如若附带的相干内容是一个地址,那么此时的
URI 也是一个 URL
(uniform resource locator)(统一资源定位符)
,如:

data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7

 不仅是多少的付出,在多少的渲染时候,也足以如此用:<img
src=”data:image/jpg;base64,iVBORw0KGgo”/>等效于:<img
src=”;

☞ 增加阅读

  • RFC 2397 RFC文档
  • MDN –
    data_URIs MDN文档
  • MSDN – data
    Protocal.aspx) MSDN文档
  • NC –
    data_uris_explained
  • phpied –
    MHTML

    1 赞 1 收藏
    评论

图片 5

ftp://10.1.1.10/path/to/filename.ext
http://example.com/source/id

其情商为 data,并报告客户端将以此情节作为 image/gif
格式来分析,需求分析的内容使用的是 base64
编码。它一贯包罗了内容但并不曾一个规定的资源地址。

 优点:Data
URL是在该地向来绘制图片,不是从服务器加载,所以节省了一个HTTP
请求,起到加快网页的效益。

商事前边的情节,可以告知客户端一个准确下载资源的地点,而
URI
并不一定包蕴一个地点音信,如(demo):

图片 6

 缺点:适合于小图片,因为用那种办法会追加网页的大大小小,所以文件太大了不对路,别的IE8以下浏览器不扶助那种艺术。用那种方法会加重客户端的CPU和内存负担,因为浏览器不会缓存那种图像。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website