【JavaScript 漫游】【040】Blob 对象

深夜小巷

文章简介

本篇文章为【JavaScript 漫游】专栏的第 040 篇文章,对浏览器模型中的 Blob 对象进行了总结。

概述

Blob 对象表示一个二进制文件的数据内容,比如一个图片文件的内容就可以通过 Blob 对象读写。它通常用来读写文件,它的名字是 Binary Large Object(二进制大型对象)的缩写。

浏览器原生提供 Blob() 构造函数,用来生成实例对象。

new Blob(array, [, options]);

Blob 构造函数接受两个参数。第一个参数是数组,成员是字符串或二进制对象,表示新生成的 Blob 实例对象的内容;第二个参数是可选的,是一个配置对象,目前只有一个属性 type,它的值是一个字符串,表示类型的 MIME 类型,默认是空字符串。

var htmlFragment = ['<a id="a"><b id="b">hey!</b></a>'];
var myBlob = new Blob(htmlFragment, {type : 'text/html'});
var obj = { hello: 'world' };
var blob = new Blob([ JSON.stringify(obj) ], {type : 'application/json'});

实例属性和实例方法

Blob 具有两个实例属性 sizetype,分别返回数据的大小和类型。

var htmlFragment = ['<a id="a"><b id="b">hey!</b></a>'];
var myBlob = new Blob(htmlFragment, {type : 'text/html'});myBlob.size // 32
myBlob.type // "text/html"

Blob 具有一个实例方法 slice,用来拷贝原来的数据,返回的也是一个 Blob 实例。

myBlob.slice(start, end, contentType); // contentType: 新实例的数据类型,默认为空字符串

获取文件信息

文件选择器 <input type="file"> 用来让用户选取文件。出于安全考虑,浏览器不允许脚本自行设置这个控件的 value 属性,即文件必须是用户手动选取的,不能是脚本指定的。一旦用户选好了文件,脚本就可以读取这个文件。

文件选择器返回一个 FileList 对象,该对象是一个类似数组的成员,每个成员都是一个 File 实例对象。File 实例对象是一个特殊的 Blob 实例,增加了 namelastModifiedDate 属性。

// HTML 代码如下
// <input type="file" accept="image/*" multiple οnchange="fileinfo(this.files)"/>function fileinfo(files) {for (var i = 0; i < files.length; i++) {var f = files[i];console.log(f.name, // 文件名,不含路径f.size, // 文件大小,Blob 实例属性f.type, // 文件类型,Blob 实例属性f.lastModifiedDate // 文件的最后修改时间);}
}

除了文件选择器,拖放 API 的 dataTransfer.files 返回的也是一个FileList 对象,它的成员因此也是 File 实例对象。它的成员因此也是 File 实例对象。

下载文件

AJAX 请求时,如果指定 responseType 属性为 blob,下载下来的就是一个 Blob 对象。

function getBlob(url, callback) {var xhr = new XMLHttpRequest();xhr.open('GET', url);xhr.responseType = 'blob';xhr.onload = function () {callback(xhr.response);}xhr.send(null);
}

生成 URL

浏览器允许使用 URL.createObjectURL(),针对 Blob 对象生成一个临时 URL,以便于某些 API 使用。这个 URL 以 blob:// 开头,表明对应一个 Blob 对象,协议头后面是一个识别符,用来唯一对应内存里面的 Blob 对象。

var droptarget = document.getElementById('droptarget');droptarget.ondrop = function (e) {var files = e.dataTransfer.files;for (var i = 0; i < files.length; i++) {var type = files[i].type;if (type.substring(0,6) !== 'image/')continue;var img = document.createElement('img');img.src = URL.createObjectURL(files[i]);img.onload = function () {this.width = 100;document.body.appendChild(this);URL.revokeObjectURL(this.src);}}
}

上面代码通过为拖放的图片文件生成一个 URL,产生它们的缩略图,从而使得用户可以预览选择的文件。

浏览器处理 Blob URL 就跟普通的 URL 一样,如果 Blob 对象不存在,返回 404 状态码;如果跨域请求,返回 403 状态码。 Blob URL 只对 GET 请求有效,如果请求成功,返回 200 状态码。由于 Blob URL 就是普通 URL,因此可以下载。

读取文件

取得 Blob 对象以后,可以通过 FileReader 对象,读取 Blob 对象的内容,即文件内容。

FileReader 对象提供四个方法,处理 Blob 对象。Blob 对象作为参数传入这些方法,然后以指定的格式返回。

  • FileReader.readAsText():返回文本,需要指定文本编码,默认为 UTF-8
  • FileReader.readAsArrayBuffer():返回 ArrayBuffer 对象
  • FileReader.readAsDataURL():返回 Data URL
  • FileReader.readAsBinaryString():返回原始的二进制字符串
// HTML 代码如下
// <input type=’file' οnchange='readfile(this.files[0])'></input>
// <pre id='output'></pre>
function readfile(f) {var reader = new FileReader();reader.readAsText(f);reader.onload = function () {var text = reader.result;var out = document.getElementById('output');out.innerHTML = '';out.appendChild(document.createTextNode(text));}reader.onerror = function(e) {console.log('Error', e);};
}

上面代码中,通过指定 FileReader 实例对象的 onload 监听函数,在实例的 result 属性上拿到文件内容。

// HTML 代码如下
// <input type="file" οnchange="typefile(this.files[0])"></input>
function typefile(file) {// 文件开头的四个字节,生成一个 Blob 对象var slice = file.slice(0, 4);var reader = new FileReader();// 读取这四个字节reader.readAsArrayBuffer(slice);reader.onload = function (e) {var buffer = reader.result;// 将这四个字节的内容,视作一个32位整数var view = new DataView(buffer);var magic = view.getUint32(0, false);// 根据文件的前四个字节,判断它的类型switch(magic) {case 0x89504E47: file.verified_type = 'image/png'; break;case 0x47494638: file.verified_type = 'image/gif'; break;case 0x25504446: file.verified_type = 'application/pdf'; break;case 0x504b0304: file.verified_type = 'application/zip'; break;}console.log(file.name, file.verified_type);};
}

上面是 FileReader.readAsArrayBuffer() 的例子,用于读取二进制文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/761653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp中预览base64图片

一、首先要安装插件image-tools&#xff0c;插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id123 npm i image-tools --save二、引入 import {pathToBase64,base64ToPath} from image-tools三、应用 openImg(){//预览图片 let that this;uni.showLoading({title:…

哪些企业适合构建企业新媒体矩阵?

⭐关注矩阵通服务号&#xff0c;探索企业新媒体矩阵搭建与营销策略 新媒体矩阵就是在某个平台或多个平台开设、联动多个账号&#xff0c;组建有关系的不同账号集群。 在数字化转型的浪潮下&#xff0c;矩阵已然成为企业实现品牌塑造、市场开拓与用户互动的重要阵地。 然而&…

2024Android-目前最稳定和高效的UI适配方案!你头秃都没想到还能这样吧!

但是这个方案有一个致命的缺陷&#xff0c;那就是需要精准命中才能适配&#xff0c;比如1920x1080的手机就一定要找到1920x1080的限定符&#xff0c;否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话&#xff0c;UI就很可能变形&#xff0c;简单说&#xff0c;就是…

HTTP跨域

1. 简介 HTTP跨域是指不同域名下的网页请求资源时&#xff0c;由于浏览器同源策略限制&#xff0c;导致请求被阻止。为解决这一问题&#xff0c;开发者常采用跨域资源共享&#xff08;CORS&#xff09;等技术来允许合法跨域请求&#xff0c;确保网站功能正常运行。 同源 协议…

【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】

文章目录 寄存器位清0和置位函数实现示例使用方式注意事项 寄存器位清0和置位函数实现 在 C 语言中&#xff0c;可以使用宏定义来创建用于清除&#xff08;清零&#xff09;或设置&#xff08;置一&#xff09;32位地址中特定位的函数。以下是两个宏定义的示例&#xff1a; #…

记一次由于buff/cache导致服务器内存爆满的问题

目录 前言 复现 登录服务器查看占用内存进程排行 先了解一下什么是buff/cache&#xff1f; 尝试释放buffer/cache /proc/sys/vm/drop_caches dirty_ratio dirty_background_ratio dirty_writeback_centisecs dirty_expire_centisecs drop_caches page-cluster swap…

设计模式(行为型设计模式——观察者模式)

设计模式&#xff08;行为型设计模式——观察者模式&#xff09; 观察者模式 基本定义 指多个对象间存在一对多的依赖关系&#xff0c;这样一来&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 这种模式又称作发布-订阅模式…

阿里云国际设置黑白名单(针对高防实例IP)

DDoS高防支持针对高防实例设置黑名单和白名单&#xff0c;以拦截或放行指定IP的访问请求&#xff0c;配置后对该实例所有的业务生效。本文九河云介绍如何配置黑白名单。 功能介绍 黑名单IP的访问流量将被DDoS高防实例直接丢弃。白名单IP的访问流量将被DDoS高防实例直接放行。…

ideaSSM 人才引进管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 人才引进管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

分布式链上随机数和keyless account

1. 引言 相关论文见&#xff1a; Aptos团队2024年论文 Distributed Randomness using Weighted VRFs 相关代码实现见&#xff1a; https://github.com/aptos-labs/aptos-core&#xff08;Rust&#xff09; 在链中生成和集成共享随机数&#xff0c;以扩展应用和强化安全。该…

G - Find a way

题目分析 1.双重bfs,遍历两个起点求最短路再计算总和即可 2.唯一的坑点在于对于一个KFC&#xff0c;两人中可能有一个到不了&#xff0c;所以还要对到不了的点距离做处理 #include <bits/stdc.h> using namespace std; using ll long long; const int N 220;struct pos…

交通事故档案管理系统|基于JSP技术+ Mysql+Java+Tomcat的交通事故档案管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

docker 修改日志存储路径

docker 日志默认存放在 /var/lib/docker/ 下 docker info修改步骤&#xff1a; 1、停止docker服务 systemctl stop docker 2、新建配置文件 vi /etc/docker/daemon.json添加如下内容 {"data-root": "/data/docker" }3、然后把之前的数据全部复制到新目…

python 之 装饰器(Decorators)

装饰器本质上也是一个函数&#xff0c;他可以让其他函数在不需要做任何代码变动的前提下&#xff0c;增加额外的功能&#xff0c;可以接受一个函数作为参数&#xff0c;并返回一个新的函数。 1. 装饰器的定义 装饰器的基本语法是使用符号&#xff0c;后面跟着装饰器的名称。这…

leetcode 494.目标和

思路&#xff1a;可以转化为背包问题。 首先我们看到&#xff0c;题目中要求我们求出目标数的方案数。既然有正数也有负数&#xff0c;那么就一定会从数组中选一部分当负数&#xff0c;选一部分当正数。 假如我们拿z当作选取当正数的元素的和&#xff0c;sum当作全部元素之和…

十、C#基数排序算法

简介 基数排序是一种非比较性排序算法&#xff0c;它通过将待排序的数据拆分成多个数字位进行排序。 实现原理 首先找出待排序数组中的最大值&#xff0c;并确定排序的位数。 从最低位&#xff08;个位&#xff09;开始&#xff0c;按照个位数的大小进行桶排序&#xff0c;将…

06 分页

文章目录 PageInfo PageInfo package com.aistart.tech.common;import java.io.Serializable; import java.util.List;public class PageInfo<T> implements Serializable {private Integer pageNum;//当前页private Integer pageSize;//每页显示条数private Integer pa…

将OpenCV与gdb驱动的IDE结合使用

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9.0开源计算机视觉库在 Linux 中安装 下一篇&#xff1a;将OpenCV与gcc和CMake结合使用 ​ 能力 这个漂亮的打印机可以显示元素类型、、标志is_continuous和is_subm…

ClickHouse的表操作

1、背景 由于大数据平台需要对数据进行分析,因为ClickHouse是一个开源的列式数据库管理系统(DBMS)&#xff0c;专为联机分析处理(OLAP)而设计。 官方地址&#xff1a;ClickHouse 开发 | ClickHouse Docs 2、集群中的操作 在操作集群中的表的时候&#xff0c;最好是采用[dbn…

【设计模式】Java 设计模式之状态模式(State)

深入理解状态模式&#xff08;State&#xff09; 一、概述 状态模式是一种行为设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定的状态相关的行为放到一个类中&#xff0c;并且将请求委托给当前状…