2
头图

Blob

Blob对象表示一个不可变,原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取。

Blob表示的不一定是javascript原生格式的数据,File接口基于Blob,继承了blob的功能并将其扩展使其支持用户系统上的文件

要从其他非blob对象和数据构造一个Blob,请使用Blob()构造函数。如果要创建blob的子集,可以使用slice方法。

构造函数

Blob()构造函数返回一个新的Blob对象,blob的内容由参数数组中给出的值的串联组成

const aBlob = new Blob(array[, options])

构造函数接受两个参数,第一个参数是数组,成员是字符串或二进制对象等,表示新生成的Blob实例对象的内容。第二个参数可选,表示配置对象,有两个属性,type,默认值为空字符串,表示将会被放入到blob中的数组内容的MIME类型;endings,默认值是"transpartent",用于指定包含行结束符的字符串如何被写入。

示例

const obj = { hello: 'world' }
const blob = new Blob([JSON.stringify(obj)], { type: 'application/json' })
console.log(blob);
// Blob {size: 17, type: 'application/json'}

实例属性

  • Blob.size:只读,Blob对象中所包含数据的大小(字节)
  • Blob.type:只读,一个字符串,表示该Blob对象所包含数据的MIME类型,如果类型未知,则该值为空字符串

实例方法

  • Blob.text():返回一个Promise且包含blob所有内容的UTF-8格式的USVString
  • Blob.arrayBuffer():返回一个Promise且包含blob所有内容的二进制格式的ArrayBuffer
  • Blob.stream():返回一个能读取blob内容的ReadableStream
  • Blob.slice([start[, end[, contentType]]]):返回一个新的Blob对象,包含了源Blob对象中指定范围内的数据

    • start:可选,Blob里的起始下标,如果为负数,从数据的末尾开始从后往前计算,默认值0,如果start的长度大于源Blob的长度,返回一个长度为0并且不包含任何数据的Blob对象
    • end:可选,Blob里的一个下标,如果为负数,从数据的末尾开始从后往前计算,默认值为源Blob的长度
    • contentType:可选,给新的Blob赋予一个新的文档类型 type,默认值为空字符串
blob.slice(1, 3, 'application/json')
// Blob {size: 2, type: 'application/json'}
blob.slice(33, 3)
// Blob {size: 0, type: ''}

从Blob中提取数据

一种从Blob中读取内容的方法是使用FileReader

下载文件

相关知识点:

URL.createObjectURL()

URL.createObjectURL()会创建一个DOMString,其中包含一个表示参数中给出的对象的URL,这个URL的生命周期和创建它的窗口中的document绑定。这个新的URL对象表示指定的File对象或Blob对象。返回值格式 blob:URL

在每次调用createObjectURL()方法时,都会创建一个新的URL对象,即使你已经用相同的对象作为参数创建过。当不需要这些URL对象时,每个对象必须调用URL.revokeObjectURL()方法来释放。

URL.revokeObjectURL()

URL.revokeObjectURL()方法用来释放一个之前已经存在的,通过调用URL.createObjectURL()方法创建的URL对象。当你结束使用某个URL对象之后,应该通过调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。

function download(blob){
    const url = URL.createObjectURL(blob)
    const link = document.createElement('a')
    document.body.appendChild(link)
    link.download = file.name // download属性指定文件名
    link.href = url // 为href属性指定下载链接
    link.click() // 触发link的click事件
    document.body.removeChild(link)
    URL.revokeObjectURL(url)
}
// download方法传入的参数可以是File对象也可以是Blob对象

读取文件内容

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <input type="file" id="input">
  <button onclick="getFile()">提交</button>
  <script>
    function getFile() {
      let fileDom = document.querySelector('#input')
      console.log(fileDom.files)
      const file = fileDom.files[0]
      const reader = new FileReader()
      reader.readAsText(file, 'UTF-8')
      reader.onload = function() {
        console.log(reader.result)
      }
    }
  </script>
</body>
</html>

FileReader

FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件的内容,使用FileBlob对象指定要读取的文件或内容。

注意:FileReader仅用于以安全的方式从用户(远程)系统读取文件内容,它不能用于从文件系统中按路径名简单的读取文件。要在js中按路径名读取文件,应使用标准Ajax解决方案进行服务器端文件读取。

构造函数

使用FileReader()构造器去创建一个新的FileReader

const reader = new FileReader()

实例属性

  • FileReader.error:只读,表示在读取文件时发生的错误,一个DOMException
  • FileReader.readyState:只读,表示FileReader状态的数据

    • 值为0,表示还没加载任何数据,EMPTY
    • 值为1,表示数据正在被加载,LOADING
    • 值为2,表示已完成全部的读取请求,DONE
reader = new FileReader()
console.log(reader.readyState) // 0
reader.readAsText(file, 'UTF-8')
console.log(reader.readyState) // 1
reader.onload = function() {
    console.log(reader.readyState) // 2
}
  • FileReader.result:只读,文件的内容,该属性仅在读取操作完成后才有效,数据的格式取决于使用哪种方法来启动读取操作

实例方法

  • FileReader.abort():中止读取操作,在返回时,readyState属性为DONE

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

  • FileReader.readAsText():将Blob或File对象根据特殊的编码格式转换为字符串形式内容,可以指定文本编码,默认UTF-8。常用来读取文本文件
  • FileReader.readAsArrayBuffer():将Blob或File对象读取的文件数据转换为一个ArrayBuffer对象
  • FileReader.readAsBinaryString():将Blob或File对象读取的文件数据转换为文件原始二进制格式,该特性是非标准的,尽量不要在生产环境使用
  • FileReader.readAsDataURL():将Blob或File对象读取的文件数据转换为包含一个data:URL格式的字符串(Base64编码)

事件处理

  • FileReader.onloadstart:处理loadstart事件,该事件在读取操作开始时触发
  • FileReader.onload:处理load事件,该事件在读取操作完成时触发
  • FileReader.onloadend:处理loadend事件,该事件在读取操作结束时(要么成功,要么失败)触发
  • FileReader.onerror:处理error事件,该事件在读取操作发生错误时触发
  • FileReader.onabort:处理abort事件,该事件在读取操作被中断时触发
  • FileReader.onprogress:处理progress事件,该事件在读取Blob时触发
reader = new FileReader()
reader.readAsText(file, 'UTF-8')
reader.onloadstart = function() {
    console.log("start");
}
reader.onprogress = function() {
    console.log("progress");
}
reader.onload = function() {
    console.log("load")
}
reader.onloadend = function() {
    console.log("end")
}
// start
// progress
// load
// end

结语

❤️ 🧡 💛大家喜欢我写的文章的话,欢迎大家点点关注、点赞、收藏和转载!!

欢迎关注公众号前端开心果 🔥我会持续更新前端相关的内容文章哦。


风如也
202 声望11 粉丝

分享努力写前端代码的生活