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 相关文章推荐
jquery 问答知识整理
Feb 11 Javascript
事件模型在各浏览器中存在差异
Oct 20 Javascript
用方法封装javascript的new操作符(一)
Dec 25 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
May 27 Javascript
jquery禁止回车触发表单提交
Dec 12 Javascript
JavaScript中使用数组方法汇总
Feb 16 Javascript
快速使用Bootstrap搭建传送带
May 06 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 Javascript
VUE2实现事件驱动弹窗示例
Oct 21 Javascript
node版本管理工具n包使用教程详解
Nov 09 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 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
php对象和数组相互转换的方法
2015/05/12 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
laravel5.6实现数值转换
2019/10/23 PHP
什么是JavaScript
2009/08/13 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python入门篇之对象类型
2014/10/17 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
想学python 这5本书籍你必看!
2018/12/11 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
python输入错误后删除的方法
2019/10/12 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
python如何调用java类
2020/07/05 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
Pycharm github配置实现过程图解
2020/10/13 Python
在线服装零售商:SheIn
2016/07/22 全球购物
百联网上商城:i百联
2017/01/28 全球购物
struct和class的区别
2015/11/20 面试题
大学生求职简历的自我评价范文
2013/10/12 职场文书
泰山导游词
2015/02/02 职场文书
2015年市场部工作总结
2015/04/30 职场文书
家长通知书家长意见
2015/06/03 职场文书
JavaScript 定时器详情
2021/11/11 Javascript
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python