`

[转]data类型的Url格式:把小数据直接嵌入到Url中

阅读更多
所谓"data"类型的Url格式,是在RFC2397中提出的,目的对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入。例如对于img这个Tag,哪怕这个图片非常非常的小,小到只有一个点,也是要从另外一个外部的图片文件例如gif文件中读入的,如果浏览器实现了data类型的Url格式,这个文件就可以直接从页面文件内部读入了。
data类型的Url格式早在1998年就提出了,时至今日,Firfox、Opera、Safari和Konqueror这些浏览器都已经支持,但是IE直到7.0版本都还没有支持,IE不支持的东西太多了,也不差这一个。:(

小例子
下面这个html代码可以在支持data类型Url的浏览器中运行,例如Firefox。运行后会看到一条蓝色渐变底色的标题。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<style type="text/css"> 
.title { 
  background-image:url(data:image/gif;base64,R0lGODlhAQAcALMAAMXh96HR97XZ98Hf98Xg97DX97nb98Lf97vc98Tg973d96rU97ba97%2Fe96XS9wAAACH5BAAAAAAALAAAAAABABwAAAQVMLhVBDNItXESAURyDI2CGIxQLE4EADs%3D); 
  background-repeat:repeat-x; 
  height:28px; 
  line-height: 28px; 
  text-align:center; 
} 
</style>
</head> 
<body> 
<div class="title">Hello, world!</div> 
</body> 
</html>

这个渐变的蓝色底色实际上是用一个1x28的小图片通过横行重复(repeat-x)形成的。这个图片很小,不过104个字节,直接嵌入到html或css文件还是很合适的。
data格式的Url最直接的好处是,这些Url原本会引起一个新的网络访问,因为那里是一个网页的地址,现在不会有新的网络访问了,因为现在这里是网页的内容。这样做,会减少服务器的负载,当然同时也增加了当前网页的大小。所以对“小”数据特别有好处。

data类型Url的形式
既然是Url,当然也可以直接在浏览器的地址栏中输入。
data:text/html,<html><body><b>Hello, world!</b>
</body></html>

在浏览器中输入以上的Url,会得到一个加粗的"Hello, world!"。也就是说,data:后面的数据直接用做网页的内容,而不是网页的地址。
简单的说,data类型的Url大致有下面几种形式。
data:,<文本数据> 
data:text/plain,<文本数据> 
data:text/html,<HTML代码> 
data:text/html;base64,<base64编码的HTML代码>
data:text/css,<CSS代码> 
data:text/css;base64,<base64编码的CSS代码> 
data:text/javascript,<Javascript代码>
data:text/javascript;base64,<base64编码的Javascript代码> 
data:image/gif;base64,base64编码的gif图片数据 
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据

因为Url是一种基于文本的协议,所以gif/png/jpeg这种二进制属于需要用base64进行编码。换句话说,引入base64以后,就可以支持任意形式的数据格式。下面是个png图片的例子,会在浏览器中显示一个Mozilla的图标。
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==


data格式Url的种种应用举例
可以在Html的Img对象中使用,例如
[img]data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAF...[/img]

可以在Css的background-image属性中使用,例如
div.image { 
  width:100px; 
  height:100px; 
  background-image:url(data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAF...); 
}

可以在Html的Css链接处使用,例如
<link rel="stylesheet" type="text/css" href="data:text/css;base64,LyogKioqKiogVGVtcGxhdGUgKioq..." />

可以在Html的Javascript链接处使用,例如
<script type="text/javascript" href="data:text/javascript;base64,dmFyIHNjT2JqMSA9IG5ldyBzY3Jv..."></script>

完整的语法定义
在RFC中,完整的语法定义如下。
dataurl    := "data:" [ mediatype ] [ ";base64" ] "," datamediatype  := [ type "/" subtype ] *( ";" parameter )data       := *urlchar 
parameter  := attribute "=" value]]

urlchar指的就是一般url中允许的字符,有些字符需要转义,例如"="要转义为"%3D",不过我测试下来,至少在Firefox里面,不转义也是可以的。
parameter可以对mediatype进行属性的扩展,常见的是charset,用来定义编码格式,在多语言情况下需要用到。例如下面的例子。
data:text/plain;charset=UTF-8;base64,5L2g5aW977yM5Lit5paH77yB
这个例子会显示出"你好,中文!"。如果吧charset部分去掉,就会显示乱码,因为我用的是UTF-8编码。



Firefox有一个data类型Url的测试页面,列出了各种格式的data类型Url的测试Url,和测试结果说明。
base64编码和内容的隐秘
把二进制数据转换成为Base64不是什么难事,比如Total Commander就有这样的功能。还有一些在线资源, http://www.greywyvern.com/code/php/binary2base64
http://www.kawa.net/works/js/data-scheme/base64-e.html
有些在线转换把base64里面的“=”转换成为%3D,这个在Url中和“=”是一样的,不转换也没什么问题。
当然,这种Url还有一种隐秘的好处,就是将一些道貌岸然者不喜欢的东西,堂而皇之的放在页面上



注:FCKEditor用的就是这玩意。
0
7
分享到:
评论

相关推荐

    浏览器中的data类型的Url格式 data:image/png,data:image/jpeg!

    数据类型URL(Data URL Scheme)是一种在Web开发中用于嵌入小型数据块到HTML文档或CSS样式表中的方法。这种格式最初在1998年的RFC2397中被定义,目的是为了允许开发者直接在页面内包含小量的数据,而无需从外部文件...

    用Visual Studio 2010编写Data Url生成工具C#源码

    这个工具可以作为一个基础,扩展到更复杂的场景,例如支持更多类型的文件格式、批量生成Data URLs、或者集成到其他应用程序中作为数据嵌入的组件。 总结来说,这个Data URL生成工具项目展示了如何利用C#和Visual ...

    探究dataURI中使用SVG正确姿势

    在现代Web开发中,dataURI是一种将数据嵌入到页面中的技术,它可以避免额外的HTTP请求,提高页面加载速度。SVG(Scalable Vector Graphics)则是一种基于XML的矢量图像格式,支持交互和动画,广泛应用在网页设计中。...

    前端开源库-dataurl

    数据URL(Data URL)是一种在Web开发中用于嵌入小量数据的方式,它允许将文本、图像、音频或视频等资源直接编码为一个URL。这种技术可以减少HTTP请求,提高页面加载速度,尤其是在处理小图标或者简短的文本时特别...

    PyPI 官网下载 | data_url-1.0.1.tar.gz

    总的来说,"PyPI 官网下载 | data_url-1.0.1.tar.gz"是一个方便开发者处理数据URL的Python库,通过理解其功能、API和安装方法,我们可以有效地利用这个工具提高工作效率,特别是在处理需要在URL中嵌入数据的场景下。

    HTML5图片dataURL转换工具.zip

    7. **逆向转换**:将dataURL转回图片文件,通常需要先解码dataURL中的Base64字符串,然后使用Blob对象构建新的二进制数据,最后通过URL.createObjectURL方法创建一个临时的可下载链接。 8. **安全与隐私**:虽然...

    Data URI浅析

    数据类型指定了Data URI所包含的数据格式。常见的类型包括但不限于: - `image/*`:用于图像文件。 - `text/*`:用于纯文本文件。 - `application/*`:用于应用程序数据。 例如,`data:image/png`表示该Data URI...

    Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例

    Data URI方案是一种编码机制,它允许在网页中直接嵌入文件数据,而无需通过URL访问外部资源。格式通常如下所示: `data:[][;base64],&lt;data&gt;` 其中,mediatype 是指MIME类型,比如图片的MIME类型可以是`image/png`、...

    加载图像并将跟踪的轮廓作为imagesvgxmlURL编码数据导出

    当我们需要将SVG数据嵌入到URL中,如以"data:image/svg+xml;charset=utf-8,"开头的data URL,必须对SVG字符串进行编码。这样,浏览器可以直接解析这个URL并渲染图像,而无需额外的HTTP请求。 5. 应用场景:这个技术...

    从URL里获取文件路径,显示swf文档

    在IT行业中,我们经常需要处理各种网络资源,其中包括从URL中获取文件路径并展示特定类型的文档,例如SWF(Shockwave Flash)文件。SWF是一种用于在网络上传输多媒体内容的格式,常见于早期的网页动画和游戏。这篇...

    JS实例:用javascript将数据导入Excel

    5. **Data URI方案**:可以使用Data URI scheme将数据直接嵌入到HTML的`&lt;a&gt;`标签的`href`属性中,使得用户可以直接下载。例如,对于CSV,可以生成一个包含`data:text/csv;charset=utf-8;base64,`前缀的URL。 6. **...

    JavaScript将base64图片转换成formData并通过AJAX提交的实现方法

    使用该技术实现图片上传的好处是不需要重新配置服务器端的接收机制,可以直接利用现有的form表单的文件上传接口,只需在前端进行适当的数据格式转换即可。这样做的缺点在于,需要在前端处理较为复杂的编码转换逻辑,...

    Python3实现Markdown生成的网页中嵌入本地图片

    这里的`image/jpeg`是图片的MIME类型,`BASE64_ENCODED_IMAGE_DATA`是Base64编码后的图片数据。 4. **写入Markdown文件**: 将生成的Markdown格式的图片链接插入到Markdown文档中,可以是一个新的图片标签,也可以...

    Access数据库里二进制数据读取,并显示为图片.rar

    最后,HTML的`&lt;img&gt;`标签使用了数据URL,将Base64编码后的二进制数据直接嵌入到页面中,从而在浏览器中显示图片。 总结来说,无论是使用VBA还是ASP,读取Access数据库中的二进制图片数据并进行显示,都需要连接...

    Go-SVGdatauri用于在CSS中内联小型SVG图标

    Go语言提供了一个名为Go-SVGdatauri的工具,专门用于将SVG图标转换为data URI格式,以便于在CSS中直接引用。 data URI是一种在Web内容中嵌入资源的方式,它允许将图片、字体等数据编码为Base64字符串,并直接放在...

    vueCli3.0文件上传后,后端返回流,前端转换成pdf预览的3种方式

    另一种方法是将PDF流数据转换为URL,然后嵌入到`&lt;iframe&gt;`标签中。这可以避免直接操作PDF.js的复杂性,但可能对文件大小有限制: ```javascript const iframe = document.createElement('iframe'); iframe.src ...

    ExtractRFC2397Files:python脚本,用于提取以“数据”形式嵌入的文件

    该标准定义了一个URL方案,即"data",允许将小型数据对象直接嵌入到URL中,而不是通过网络链接引用外部资源。数据URL由以下部分组成: 1. `data:`: 前缀,表示这是一个数据URL。 2. _MIME类型_:指定数据的格式,...

    如何将SilverLight嵌入到SharePoint中

    在本文中,我们将深入探讨如何将Silverlight应用程序嵌入到SharePoint环境中,以便在SharePoint页面上实现丰富的媒体体验,如播放音乐。首先,我们需要理解Silverlight是如何在ASP.NET页面上运行的。它通常通过HTML...

    phonegap 中如何直接使用json格式数据

    然而,当服务器不支持 JSONP 或者你无法控制服务器返回的数据格式时,PhoneGap 仍然可以使用 JSON 数据,只是需要绕过浏览器的同源策略。例如,PhoneGap 提供了 Cordova插件,如Whitelist Plugin 和 InAppBrowser,...

Global site tag (gtag.js) - Google Analytics