前端二进制流的关系

 Blob

全称:binary large object,二进制大对象,是一个js对象,可以用来存储大量二进制编码格式的数据,Blob对象是不可修改的,读取内容的唯一方法是FileReader。

创建一个Blob对象:

new Blob(array,options)

array:由ArrayBuffer,ArrayBufferView,Blob,DOMString等对象构成的,将会被放进Blob;

options:

type:默认为空"",表示将被放到blob中数组内容的MIME类型。

endings:默认为"transparent",用于指定包含行结束符\n的字符串如何被写入,不常用。

MIME类型 描述
text/plain 纯文本
text/html HTML文档

text/javascript

Js文件
text/css css文件
application/json json文件
application/pdf pdf文件
application/xml xml文件
image/jpeg jpeg图像
image/png png图像
image/svg+xml svg图像
image/gif gif图像
audio/mpeg mp3文件
video/mpeg mp4文件

创建:

<!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>

</body>
<script>
    let blob = new Blob(["helloworld"],{type:"text/plain"})
    console.log(blob); //Blob {size: 10, type: 'text/plain'}
</script>

</html>

注意这里必须使用浏览器打开,node中没有blob对象,会报错。

分片

blob对象内置slice()方法,可以将blob对象分片

三个参数:

start:设置切片的起点,即切片开始的位置,默认值为0,表示从第一个字节开始。

end:设置切片的结束点,会对该位置之前的数据进行切片,默认值为blob.size.

contentType:设置新blob的MIME类型,如果省略,则默认为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>

</body>
<script>
    let blob = new Blob(["helloworld"],{type:"text/plain"})
    let blob2 = blob.slice(0,5,"text/plain")
    let fileReader= new FileReader()
    fileReader.readAsText(blob2)
    fileReader.onload=function(res){console.log(res.target.result);} //读取完文件触发,hello
</script>

</html>

File

File对象是特殊类型的object,在js中主要有两种方法来获取File对象:

1.input输入框选择文件后,返回的fileList对象

2.文件拖放操作生成的Datatransfer对象

<!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="file">
</body>
<script>

    file.onchange = function (e) {
        console.log(e.target.files); //可以查到对应上传的文件,file是继承blob的对象
    }
</script>

</html>
<!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>
<style>
    .dropArea{
        width: 300px;
        height: 300px;
        border:1px solid red;
    }
</style>
<body>
    <div class="dropArea" id="dropArea">

    </div>
</body>
<script>
    dropArea.ondragover=function(e){
        e.preventDefault();
    }
    dropArea.ondrop=function(e){
        e.preventDefault()
        console.log(e.dataTransfer.files); //可看到对应的文件
    }
</script>

</html>

FileReader

fileReader提供了读取blob里面内容的方法

1.readAsArrayBuffer():读取指定的Blob内容,result属性中保存的将是被读取文件的ArrayBuffer对象。

2.readAsBinaryString():读取指定的Blob内容,result属性中保存的将是被读取文件的原始二进制数据。

3.readAsDataURL():读取指定的Blob内容,result属性包含一个data:URL格式的Base64字符串。

4.readAsText():读取指定的Blob内容,result属性包含一个字符串表示所读取的文件内容。

还有一些api:

 转base64

<!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="file">
</body>
<script>
    let fileReader = new FileReader()
    file.onchange = function (e) {
        console.log(e.target.files); //可以查到对应上传的文件,file是继承blob的对象
        fileReader.readAsDataURL(e.target.files[0])//转base64
        fileReader.onload = function (res) { console.log(res.target.result); }//显示base64的字符串
    }
</script>

</html>

转字符串且读取:

<!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>

</body>
<script>
    let blob = new Blob(["helloworld"],{type:"text/plain"})
    let fileReader= new FileReader()
    fileReader.readAsText(blob)
    fileReader.onload=function(res){console.log(res.target.result);} //读取完文件触发,hello
</script>

</html>

ArrayBuffer

我们可以理解为特殊的数组,不能直接操作所存储的数据,我们使用的还是下面TypeArray九个对象

 分为两种工具,一种是TypeArray类型的,另外一种就是DataView,前者的数组成员都是同数据类型,后者可以是不同的数据类型,类似于元组。

 TypeArray创建并操作buffer

<!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>
    
</body>
<script>
    let buffer = new ArrayBuffer(32)
    console.log(buffer);
    let buffer2=new Int8Array(buffer)
    buffer2[0]=100 //可以操作数据
    console.log(buffer2);
</script>
</html>

DataView提供了以下方法来操作buffer:

读取(参数都是一个字节序号,表示开始读取的字节位置) 存储(参数两个,第一个为开始写入数据的字节序号,第二个是写入的数据)
getInt8:读取1个字节,返回一个8位整数 setInt8:写入1个字节的8位整数
getUint8:读取1个字节,返回一个无符号的8位整数 setUint8:写入1个字节的无符号的8位整数
getInt16:读取2个字节,返回一个16位整数 setInt16:写入2个字节的16位整数
getUint16:读取2个字节,返回一个无符号的16位整数 setUint16:写入2个字节的无符号的16位整数
getInt32:读取4个字节,返回一个32位整数 setInt32:写入4个字节的32位整数
getUint32:读取4个字节,返回一个无符号的32位整数 setUint32:写入2个字节的无符号的32位整数

getFloat32:读取4个字节,返回一个32位浮点数

setFloat32:写入4个字节32位浮点数
getFloat64:读取8个字节,返回一个64位浮点数 setFloat64:写入8个字节64位浮点数
<!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>
    
</body>
<script>
    let buffer = new ArrayBuffer(32)
    let dataView=new DataView(buffer)
    dataView.setInt8(0,100)
    console.log(dataView.getInt8(0)); //100
</script>
</html>

Object URL

用来表示File Object 或 Blob Object的URL

<!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="file">
</body>
<script>
    let fileReader = new FileReader()
    file.onchange = function (e) {
        console.log(e.target.files); //可以查到对应上传的文件,file是继承blob的对象
        URL.createObjectURL(e.target.files[0])//转为Object URL
        console.log(URL.createObjectURL(e.target.files[0]))
    }
</script>

</html>

Base64

在js中,有两个函数分别用来处理解码和编码base64字符串:

atob():解码,解码一个base64字符串,

btoa():编码从一个字符串或者二进制数据编码一个base64字符串

let str = atob(str1) 
let str2=btoa(str)

1.canvas画布内容转为base64的图片

2.将获取的图片文件,生成base64图片(fileReader来生成)

<!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>
    <canvas id="canvas" width="300" height="300"></canvas>
</body>
<script>
    let ctx=canvas.getContext("2d")
    ctx.fillRect(0,0,100,100)
    let dataUrl = canvas.toDataURL()//canvas转base64
    console.log(dataUrl);
</script>
</html>

总结:

ArrayBuffer和Blob的区别

Blob作为一个整体文件,适合用于传输,当需要对二进制数据进行操作时,使用ArrayBuffer。

通过ArrayBuffer创建Blob,然后通过FileReader读取里面的内容。

<!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>
    
</body>
<script>
    let buffer = new ArrayBuffer(8)
    let buffer2=new Int8Array(buffer)
    buffer2[0]=100
    console.log(buffer2[0]);
    let blob = new Blob([buffer2])
    let fileReader = new FileReader()
    fileReader.readAsArrayBuffer(blob)
    fileReader.onload=function(res){
        console.log(new Int8Array(res.target.result));
    }

</script>
</html>

猜你喜欢

转载自blog.csdn.net/m0_59962790/article/details/130659526