Blob API及问题记录

接上一篇<js创建下载文件>, 记录核心部分 Blob 的API, >>传送门 , 同时说下使用过程中碰到的一个问题.

先说问题:

用Blob创建后缀为.sql的文件, 内容是包含中文的文本, 结果生成的文本打开后中文部分显示乱码. 尝试加了type后,还是没有改变. 后来想到会不会是因为.sql的mime类型问题, 于是先换成了application/stram的类型, 发现问题依旧.  后来换了个思路, type不变, 取巧把后缀换成了.txt, 结果问题就好了. 因为手上事情比较多, 苦恼之下只能先采取这个方法. 哪位朋友如果有更好的方法欢迎留言告诉我, 先谢谢.

<script>
    downloadFile("创建菜单SQL脚本.txt", response);

    function downloadFile(fileName, content) {
        var aLink = document.createElement(‘a‘);
        var blob = new Blob([content], { type: "text/plain" });
        var evt = document.createEvent("HTMLEvents");
        // initEvent 不加后两个参数在FF下会报错, 感谢 Barret Lee 的反馈
        evt.initEvent("click", false, false);
        aLink.download = fileName;
        aLink.href = URL.createObjectURL(blob);
        aLink.dispatchEvent(evt);
    }
</script>

Blob API:

  1. 属性
  1. 构造函数
  2. 方法
    1. slice()

      1. 参数
      2. 返回值
      3. 注意
  3. BlobPropertyBag
  4. Blob构造函数用法举例
  5. 例子:使用类型数组和Blob对象创建一个对象URL
  6. 浏览器兼容性
    1. 注意:关于slice()的实现
    2. Gecko备注
  7. 相关链接

一个Blob对象就是一个包含有只读原始数据的类文件对象。Blob对象中的数据并不一定得是JavaScript中的原生形式。File接口基于Blob,继承了Blob的功能,并且扩展支持了用户计算机上的本地文件。

创建Blob对象的方法有几种,可以调用Blob构造函数,还可以使用一个已有Blob对象上的slice()方法切出另一个Blob对象,还可以调用canvas对象上的toBlob方法。

注: 需要注意的是,一些浏览器上的slice()方法仍带有前缀:Firefox 12之前的版本上为blob.mozSlice(),Safari上为blob.webkitSlice()

注: 一些浏览器提供了BlobBuilder接口,但并不是所有的浏览器都支持BlobBuilder,而且现有的BlobBuilder实现都是带前缀的。更主要的是BlobBuilder已经被废弃,你应该尽可能的使用Blob构造函数来代替。

属性Edit

属性名     类型 描述
size        unsigned long long Blob对象中所包含数据的大小只读。
type DOMString 一个字符串,表明该Blob对象所包含数据的MIME类型。如果类型未知,则该值为空字符串。只读。

构造函数Edit

Blob Blob(
  [optional] Array parts,
  [optional] BlobPropertyBag properties
);
参数
parts
一个数组,包含了将要添加到Blob对象中的数据。数组元素可以是任意多个的ArrayBufferArrayBufferView (typed array), Blob,或者 DOMString对象。
properties
一个对象,设置Blob对象的一些属性。查看BlobPropertyBag一节。

方法Edit

slice()

返回一个新的Blob对象,包含了源Blob对象中指定范围内的数据

Blob slice(
  optional long long start,
  optional long long end,
  optional DOMString contentType
);

参数

start可选
开始索引,可以为负数,语法类似于数组的slice方法。默认值为0。
end可选
结束索引,可以为负数,语法类似于数组的slice方法。默认值为最后一个索引
contentType可选
新的Blob对象的MIME类型,这个值将会成为新的Blob对象的type属性的值,默认为一个空字符串

返回值

一个新的Blob对象,包含了源Blob对象中指定范围内的数据

注意

如果start参数的值比源Blob对象的size属性的值还大,则返回的Blob对象的size值为0,也就是不包含任何数据。

BlobPropertyBagEdit

一个包含有两个属性typeendings的对象。

type
设置该Blob对象的type属性
endings(已废弃)
对应于BlobBuilder.append()方法的endings参数。该参数的值可以是"transparent"或者"native"。

Blob构造函数用法举例Edit

下面的代码:

var aFileParts = [‘<a id="a"><b id="b">hey!</b></a>‘];
var oMyBlob = new Blob(aFileParts, { "type" : "text/xml" }); // the blob

等价于:

var oBuilder = new BlobBuilder();
var aFileParts = ["<a id=\"a\"><b id=\"b\">hey!<\/b><\/a>"];
oBuilder.append(aFileParts[0]);
var oMyBlob = oBuilder.getBlob("text/xml"); // the blob

BlobBuilder接口提供了另外一种创建Blob对象的方式,但该方式现在已经废弃,所以不应该再使用了。

例子:使用类型数组和Blob对象创建一个对象URLEdit

var typedArray = GetTheTypedArraySomehow();
var blob = new Blob([typedArray], {type: "application/octet-binary"}); // 传入一个合适的MIME类型
var url = URL.createObjectURL(blob);
// 会产生一个类似blob:d3958f5c-0777-0845-9dcf-2cb28783acaf这样的URL字符串
// 你可以像使用一个普通URL那样使用它,比如用在img.src上。

浏览器兼容性Edit

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 5 4 10 11.10 5.1
slice()
21
10 webkit

13
5 moz
10 12 5.1 (534.29) webkit
Blob() constructor 20 13.0 (13.0) 10 12.10 6 (536.10)
Feature Android Firefox Mobile (Gecko) IE Phone Opera Mobile Safari Mobile
Basic support ? 13.0 (13.0) ? ? ?

注意:关于slice()的实现

slice()方法一开始使用length来作为第二个参数,表示需要向新的Blob对象拷贝多少个字节。如果你指定的参数值start + length的值超过了源Blob对象的长度,则返回的Blob对象包含了从start索引到源Blob对象结束索引处的所有数据

这个版本的slice()实现于Firefox 4WebKit,以及 Opera 11.10中。可是,由于这个语法和我们常用的Array.slice()以及String.slice()语法不同,所以已被废弃。Gecko和WebKit目前支持的是新版的slice语法。

从Gecko 13.0 (Firefox 13.0 / Thunderbird 13.0 / SeaMonkey 2.10)和Chrome 21开始,slice()去掉了前缀。

Gecko备注

在Gecko 12.0 (Firefox 12.0 / Thunderbird 12.0 / SeaMonkey 2.9)之前,slice()方法有个bug,就是参数startend的值不能超出64位无符号数字范围,现已修复。

相关链接Edit


时间: 2024-11-02 19:51:44

Blob API及问题记录的相关文章

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

MonkeyImage API 实践全记录

1.    背景 鉴于网上使用MonkeyImage的实例除了方法sameAs外很难找到,所以本人把实践各个API的过程记录下来然自己有更感性的认识,也为往后的工作打下更好的基础.同时也和上一篇文章<MonkeyDevcie API 实践全记录>起到相互呼应的作用. 因为并没有MonkeyRunner的项目背景,所以这里更多的是描述各个API是怎么一回事,而不是描述在什么场景下需要用到.也就是说是去回答What,而不是How. 首先我们先看下官方给出的MonkeyImage的API描述,对比我

Dynamics CRM2016 Web API之更新记录

本篇继续探索web api,介绍如何通过web api更新记录. 下面是一段简单的更新代码,更新了几个不同类型的字段,entity的赋值和前篇创建时候的一样的. var entity = {}; entity["name"] = '测试更新';//文本 entity["new_gender"] = 100000001;//选项集 entity["new_birth"] = new Date();//日期 entity["[email p

MonkeyDevcie API 实践全记录

1.    背景 使用SDK自带的NotePad应用作为实践目标应用,目的是对MonkeyDevice拥有的成员方法做一个初步的了解. 以下是官方列出的方法的Overview. Return Type Methods Comment void broadcastIntent (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component compo

api接口的记录

http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=100&offset=0参数: type = 1---新歌榜(100),2---热歌榜(100),14---影视金曲榜(100),15---港台(78),16---流行(100),17---欧美(100),20---华语金曲榜(100), 21---欧美金曲榜(100),22---经典老歌

php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restful api 请明白一点,这个只是设计指导思想,也就是设计风格 ,比如你需要遵循这些原则 原则条件REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.从客户端到服务

5.hadoop流原理、实例和新旧API下Wordcount详解

前四篇文章讲了Hadoop的配置和测试以及eclipse下的使用,有兴趣的可以先看下. 1.Hadoop流简介 用可执行文件作为Mapper和Reducer,接受的都是标准输入,输出的都是标准输出. 当一个可执行文件作为Mapper时,每一个Map任务会以一个独立的进程启动这个可执行文件,然后在Map任务运行时,会把输入切分成行提供给可 执行文件,并作为它的标准输入(stdin)内容.当可执行文件运行出结果时,Map从标准输出(stdout)中收集数据,并将其转化 为<key, value>对

EasyMonkeyDevice vs MonkeyDevice&amp;HierarchyViewer API Mapping Matrix

1. 前言 本来这次文章的title是写成和前几篇类似的<EasyMonkeyDevice API实践全记录>,内容也打算把每个API的实践和建议给记录下来,但后来想了下觉得这样子并不是最好的方法,鉴于EasyMonkeyDevice其实就是在前几章描述的MonkeyDevice和HierarchyViewer的基础上加了一层Wrapper,把原来的通过接受坐标点或者ViewNode来操作控件的思想统一成通过控件ID来操作,其实最终它们都会转换成坐标点或ViewNode进行操作.以touch和