简介

  Blob在js中意味着二进制大数据。实现该接口的对象有3个属性,分别是type(MIME),size(byte)和

一个切割方法:slice(在大文件分片上传可能用到)。另外,File实现了Blob接口,并且还有额外的属性--name和

lastModify。

  早起的一些浏览器实现了草案(已废弃)上的BlobBuilder,但是现在的大多浏览器废弃了该对象。目前,创建新的

Blob对象需要使用Blob构造函数,new Blob(array,type)。第一个参数数组中可以包含字符串,ArrayBuffer对象或者

一个Blob对象。

  现对比这两种方式:

  

       // 构造函数创建
var ab = new ArrayBuffer(8);
var dv = new DataView(ab);
for(var i=0;i<8;i++) dv.setInt8(i,i);
var arr = ["yang li is tanGer's husband;",ab];
var b = new Blob(arr,{type: "application/octet-binary"});
console.log(b, b.type)
------------------------------------------------------------------------------
var bb = new BlobBuilder();
bb.append("yang li is tanGer's husband;")
bb.append("\0");
var ab = new ArrayBuffer(8);
var dv = new DateView(ab);
for(var i=0;i<8;i++) dv.setInt8(i,i);
bb.append(ab);
var ret = bb.getBlob("x-op\/mytype")
console.log(ret,ret.type);

  可以讲blob作为参数,创建Blob URL,它是对内存或者磁盘上Blob对象的一个引用。而Data URL则是

对文件内容进行URL编码,其本身就是数据。另外,在创建Blob URL之后,浏览器便维护URL与内存或者磁盘Blob

之间的映射,Blob对象及时已经没有用处也不会被释放,因为始终有Blob URL在引用。故,需要手动的将Blob URL删除。

  可通过FileReader对Blob读取,fileReader对象可监听多个事件,比较有用的是onload和onprocess。FileReader读取

Blob数据是异步进行的,可以用4种方式读取,常用的两种分别读取为文本和ArrayBuffer。

  但是在web Worker中可以同步运行类似的构造方法:FileReaderSync。worker同步运行该方法并不会影响当前的主线程。

  下面demo实现了一个拖动图片显示的功能:

  

    <style>
.active{background: 1px firebrick;}
.droptarget{border:3px solid royalblue;width:400px;height:400px;margin: auto;float:left;}
</style>
--------------------------------------------------------------------------
<div class="droptarget" id="droptarget"></div>
<div style="float:left;margin-left:20px;" id="show"></div>
--------------------------------------------------------------------------
var createUrl = URL && URL.createObjectURL ||
window.webkitURL && window.webkitURL.createObjectURL ||
window.createObjectURL;
var revokeUrl = URL && URL.revokeObjectURL ||
window.webkitURL && window.webkitURL.revokeObjectURL ||
window.revokeObjectURL;
function $(id){return document.getElementById(id)} $("droptarget").ondragenter = function(e){
var dt = e.dataTransfer;
//过滤文件
if(dt.types && dt.types.indexOf("Files") != -1){
this.classList.add("active");
}
return false;
}
$("droptarget").ondragleave = function(e){
this.classList.remove("active");
};
$("droptarget").ondragover = function(e){
return false;
}
$("droptarget").ondrop = function(e){
e.preventDefault();
var dt = e.dataTransfer;
var files,i,len,f;
var img,show = $("show");
files = dt.files;
for(i=0,len=files.length;i<len;i++){
f = files[i];
if(f.type.indexOf("image/") == -1) return;
img = new Image();
img.style.width = "400px";
img.src = createUrl(f);
img.onload = function(e){
show.innerHTML = "";
show.appendChild(img);
revokeUrl(img.src); // 手动删除Blob URL
}
}
this.classList.remove("active")
return false;
} // 可以使用FileReader异步对Blob对象的数据进行修改
function read(blob){
var r = new FileReader();
r.readAsText(blob); // 异步读取
r.onload = function(e){
var d = r.result;
}
r.onerror = function(e){
console.log("error happens...")
}
r.onprogress = function(e){
$("droptarget").innerText = e.loaded + "/" + e.total;
}
}

Blob初探的更多相关文章

  1. 初探JavaScript PDF blob转换为Word docx方法

    PDF转WORD为什么是历史难题 PDF 转Word 是一个非常非常普遍的需求,可谓人人忌危,为什么如此普遍的需求,却如此难行呢,还得看为什么会有这样的一个需求: PDF文档遵循iOS32000的规范 ...

  2. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  3. Weex 初探

    Weex 初探 Weex 介绍 Weex 是阿里于 2016 年开源的一款开发框架,它的介绍是: Weex 是一个使用 Web 开发体验来开发高性能原生应用的框架. 它使用了 Web 技术来开发 An ...

  4. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  5. Python3+unitest自动化测试初探(中篇)

    目录 6.生成测试报告 7.编写邮件发送工具 8.发送邮件 发布 0 86 编辑 删除 Python3+unitest自动化测试初探(中篇)(2019-04-18 01:41) 发布 3 245 编辑 ...

  6. Mycat 中间件配置初探与入门操作

    Mycat中间件配置初探与入门操作 By:授客 QQ:1033553122 实践环境 Mycat-server-1.5.1-RELEASE-20161130213509-win.tar.gz 下载地址 ...

  7. braft初探

    接上一篇<brpc初探>. 什么是RAFT 看内部一个开源项目的时候,一开始我以为他们自己实现了raft协议.但是看了代码之后,发现用的是braft.因为在我们自己bg里一直在提paxos ...

  8. Git 内部原理--初探 .git

    说到Git大家应该都非常熟悉,几乎每天都会用到它.在日常使用过程中,我们貌似并不需要关注其内部的原理,只需要记住那几个常用的命令,就可以说自己是会Git的人了.可是,事实真的是这样子的吗?今天我们就来 ...

  9. 微信小程序之文件系统初探

    微信小程序之文件系统初探 1.文件下载 //下载文件 go_download: function() { var content = this; var baseUrl = "http:// ...

随机推荐

  1. 设计模式(十三) 职责链(chain of responsibility)

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  2. 吐槽scala

    scala可能是唯一一个编译器和IDE对代码有不同理解的语言.当你开始用scala的高级特性的时候,他们的分歧特别的大,以至于现在,intellij上的scala插件已经不敢对可能编译不通过的代码标记 ...

  3. WebService的开发、部署、调用

    本文参考其它文章和自己解决中间问题的经历记录,以C#开发WebService为例子,欢迎探讨: 一.C#开发WebService 在visual studio中新建ASP.NET Web服务应用程序, ...

  4. JavaScript编码规范

    1 代码风格 1.1 结构语句 [强制] 不得省略语句结束的分号. [强制] 在 if / else / for / do / while 语句中,即使只有一行,也不得省略块 {...}. 示例: / ...

  5. FAT32 FAT区__FAT表解析

    一. FAT 表概述 位置: 紧跟在文件系统的“保留区”之后 : 有两个数据结构完全相同的FAT(FAT,File Allocation Tbale 文件分配表)组成. 作用: FAT表项,描述文件系 ...

  6. eclipse 中的注释 快捷键

    (1)Ctrl+Space  说明:内容助理.提供对方法,变量,参数,javadoc等得提示, 应运在多种场合,总之需要提示的时候可先按此快捷键. 注:避免输入法的切换设置与此设置冲突 (2)Ctrl ...

  7. JAVA演算法---約瑟夫問題

    1 public class Josephus { public static int[] arrayOfJosephus( int number, int per) { 3 int[] man = ...

  8. .NET Core 构建配置文件从 project.json 到 .csproj

    从 .NET Core SDK 1.0 Preview 3 build 004056 开始,.NET Core 弃用 project.json,回归 .csproj,主要原因是为了兼容 MSBuild ...

  9. Mongoose Schemas定义中timestamps选项的妙用

    在Node.js中使用MongoDB少不了Mongoose. 假设有如下Mongoose Schemas的定义: var ItemSchema = new mongoose.Schema({ biz: ...

  10. My first makefile to compile multiple C files

    I have three files to compile: main.c, func.c,  func.h The steps: 1   main.c   to   main.o 2   func. ...