JavaScript之Blob对象类型的具体使用方法


Posted in Javascript onNovember 29, 2019

Blob(Binary Large Object)术语最初来自数据库(oracle 中也有类似的栏位类型。),早期数据库因为要存储声音、图片、以及可执行程序等二进制数据对象所以给该类对象取名为Blob。 

 在Web领域,Blob被定义为包含只读数据的类文件对象。Blob中的数据不一定是js原生数据形式。常见的File接口就继承自Blob,并扩展它用于支持用户系统的本地文件。

JavaScript之Blob对象类型的具体使用方法

构建一个Blob对象通常有三种方式:

  • 通过Blob对象的构造函数来构建。
  • 从已有的Blob对象调用slice接口切出一个新的Blob对象。
  • canvas API toBlob方法,把当前绘制信息转为一个Blob对象。下面只看第一种的实现:

用法:新方法创建Blob 对象(构造函数来构建)

var blob = new Blob(array[optional], options[optional]);

构造函数,接受两个参数

第一个参数:为一个数据序列,可以是任意格式的值,例如,任意数量的字符串,Blobs 以及 ArrayBuffers。

第二个参数:用于指定将要放入Blob中的数据的类型(MIME)(后端可以通过枚举MimeType,获取对应类型:

MimeType mimeType = MimeType.toEnum(file.getContentType());)。
<script>
 var blob = new Blob(["Hello World!"],{type:"text/plain"});
 </script>

Blob对象的基本属性:

  • size :Blob对象包含的字节数。(只读)
  • type : Blob对象包含的数据类型MIME,如果类型未知则返回空字符串。

原生对象构建Blob

<script type="text/javascript">
window.onload = function() {
 var blob = new Blob(1234);
}
</script>

提示出错:

Uncaught TypeError: Failed to construct ‘Blob': The 1st argument is neither an array, nor does it have indexed properties.

原因在于Blob构造函数要求第一个参数必须是数组,而这里第一个参数既不是一个数组,也没有可索引的属性。既然这里提到了对象的可索引属性,让我联想到了类数组的概念,而Arguments就是一个很好的例子。来试一试:

<script type="text/javascript">
function testArgumentsBlob() {
 var blob = new Blob(arguments);
 console.log(blob.size);//3
 console.log(blob.type);//""
}
window.onload = function() {
 testArgumentsBlob(1, 2, 3);
}
</script>

可以看到即使是类数组对象,而数组元素类型是Number也能得出正确的结论,猜想大概是由于构造函数内部把Number转化为String的缘故吧!

再来试一试其他的参数类型:

window.onload = function() {
 var arg = {hello: "2016"};
 var blob = new Blob([JSON.stringify(arg, null, "\t")], {type: "application/json"});
 console.log(blob.type);//application/json
 console.log(blob.size);//20
}

blob.type等于application/json没问题。arg转为字符串后的长度为16加上制表符\t的宽度4个字节等于20。

Blob对象的基本方法: 

大文件分割 (slice() 方法),slice方法与数组的slice类似。

Blob.slice([start, [end, [content-type]]])

slice() 方法接受三个参数,起始偏移量,结束偏移量,还有可选的 mime 类型。如果 mime 类型,没有设置,那么新的 Blob 对象的 mime 类型和父级一样。

当要上传大文件的时候,此方法非常有用,可以将大文件分割分段,然后各自上传,因为分割之后的 Blob 对象和原始的是独立存在的。

不过目前浏览器实现此方法还没有统一,火狐使用的是 mozSlice() ,Chrome 使用的是 webkitSlice() ,其他浏览器则正常的方式 slice() 

可以写一个兼容各浏览器的方法:

function sliceBlob(blob, start, end, type) {
 type = type || blob.type;
 if (blob.mozSlice) {
  return blob.mozSlice(start, end, type);
 } else if (blob.webkitSlice) {
  return blob.webkitSlice(start, end type);
 } else {
  throw new Error("This doesn't work!");
 }
 }

利用Blob显示缩略图`

var input = document.createElement("input");
input.type = "file";
input.accept = "image/*";
input.multiple = true;
input.style.display = "none";
document.body.appendChild(input);

var fileSelect = document.createElement("a");
fileSelect.href = "#";
fileSelect.appendChild(document.createTextNode("Choose files"));
document.body.appendChild(fileSelect);

var imgList = document.createElement("div");
imgList.innerHTML = "<p>No file Selected!</p>"
document.body.appendChild(imgList);

input.addEventListener("change", function(e) {
var files = this.files;
if(!files.length) {
return;
}
imgList.innerHTML = "";
var list = document.createElement("ul");
imgList.appendChild(list);
for(var i = 0; i < files.length; i++) {
var li = document.createElement("li"); 
list.appendChild(li);

var img = document.createElement("img");
img.src = window.URL.createObjectURL(files[i]);
img.height = 60;
img.width = 60;
img.onload = function() {
window.URL.revokeObjectURL(this.src);
}
li.appendChild(img);
var info = document.createElement("span");
info.innerHTML = files[i].name + ":" + files[i].size + " bytes";
li.appendChild(info);
}
}, false);

fileSelect.addEventListener("click", function(e) {
input.click(); 
e.preventDefault();
}, false);

由于File对象继承自Blob,所以我们可以很方便的利用File对象加载本地系统图片文件,并通过createObjectURL生成一个URL并加以显示。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
传智播客学习之java 反射
Nov 22 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
Apr 28 Javascript
判断一个对象是否为jquery对象的方法
Mar 12 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
jQuery控制cookie过期时间的方法
Apr 07 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
Nov 26 Javascript
AngularJS初始化静态模板详解
Jan 14 Javascript
JavaScript希尔排序、快速排序、归并排序算法
May 08 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
May 31 Javascript
微信小程序返回上一级页面的实现代码
Jun 19 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
Aug 12 Javascript
Vue.js原理分析之nextTick实现详解
Sep 07 Javascript
VuePress 中如何增加用户登录功能
Nov 29 #Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 #Javascript
Vue.js实现大屏数字滚动翻转效果
Nov 29 #Javascript
Vue基础配置讲解
Nov 29 #Javascript
jQuery实现弹幕特效
Nov 29 #jQuery
Vue实现多标签选择器
Nov 28 #Javascript
swiper实现异形轮播效果
Nov 28 #Javascript
You might like
天津市收音机工业发展史
2021/03/04 无线电
PHP 木马攻击防御技巧
2009/06/13 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
Python中with及contextlib的用法详解
2017/06/08 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
幼儿园园长自我鉴定
2013/10/22 职场文书
运动会广播稿300字
2014/01/10 职场文书
销售内勤岗位职责
2014/04/15 职场文书
激励口号大全
2014/06/17 职场文书
学校社会实践活动总结
2014/07/03 职场文书
报到证办理个人委托书
2014/10/06 职场文书
学年个人总结范文
2015/03/05 职场文书
接待员岗位职责范本
2015/04/15 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
django上传文件的三种方式
2021/04/29 Python
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
用Python生成会跳舞的美女
2022/01/18 Python