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 相关文章推荐
JavaScript使用技巧精萃[代码非常实用]
Nov 21 Javascript
基于json的jquery地区联动效果代码
Jul 06 Javascript
js onkeypress与onkeydown 事件区别详细说明
Dec 13 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
Dec 24 Javascript
深入理解JSON数据源格式
Jan 10 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
Feb 17 Javascript
jQuery四种选择器使用及示例
Jun 05 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
Aug 16 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
Apr 28 Javascript
加快Vue项目的开发速度的方法
Dec 12 Javascript
微信小程序实现授权登录
May 15 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
Nov 13 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写的采集程序
2007/03/16 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
初识Javascript小结
2015/07/16 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
基于Python的身份证号码自动生成程序
2014/08/15 Python
浅谈Python中数据解析
2015/05/05 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
深入学习Python中的装饰器使用
2016/06/20 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
Python中extend和append的区别讲解
2019/01/24 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Python threading的使用方法解析
2019/08/28 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
python 写一个性能测试工具(一)
2020/10/24 Python
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
中专生自我鉴定书范文
2013/12/28 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
Java基于字符界面的简易收银台
2021/06/26 Java/Android