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实现可拖动的浮动层完整代码
May 27 Javascript
JavaScript加强之自定义callback示例
Sep 21 Javascript
JavaScript获取网页中第一个链接ID的方法
Apr 03 Javascript
JS实现列表的响应式排版(推荐)
Sep 01 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
Jan 13 Javascript
详解Weex基于Vue2.0开发模板搭建
Mar 20 Javascript
bootstrap模态框示例代码分享
May 17 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
Aug 15 jQuery
Bootstrap图片轮播效果详解
Oct 17 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
Nov 06 Javascript
详解vue 组件的实现原理
Nov 12 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的FTP学习(四)
2006/10/09 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
最短的IE判断代码
2011/03/13 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
浅谈对yield的初步理解
2017/05/29 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
优纳科技软件测试面试题
2012/05/15 面试题
求职自荐书范文
2013/12/04 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
婚礼主持结束词
2014/03/13 职场文书
机械操作工岗位职责
2014/08/08 职场文书
个人授权委托书格式
2014/08/30 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
酒店厨房管理制度
2015/08/06 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers