加载中...

Blob的三种应用场景及Blob,url,base64之间的转换

Blob是一种Javascript的对象类型,兼容到IE10

Blob 对象表示一个不可变、原始数据的类文件对象。

Blob 表示的不一定是JavaScript原生格式的数据。

File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。

       file 对象只是 blob 对象的一个更具体的版本,blob 存储着大量的二进制数据,并且 blob 的 size 和 type 属性,

       都会被 file 对象  所继承

File 对象是特殊类型的 Blob,且可以用在任意的 Blob 类型的 context 中。比如说, FileReaderURL.createObjectURL()createImageBitmap(), 及 XMLHttpRequest.send() 都能处理 Blob 和 File

Blob对象可以看做是存放二进制数据的容器,此外还可以通过Blob设置二进制数据的MIME类型。

创建Blob对象:

let blob = new Blob(["Hello World!"],{type:"text/plain"});

参数1:数据序列,任意格式的值   例如,任意数量的字符串,Blobs 以及 ArrayBuffers;

参数2:创建Blob对象的选项,有两个:

              type -- MIME 的类型。

               endings -- 决定 append() 的数据格式,(数据中的 \n 如何被转换)可以取值为 "transparent" 或者 "native"

                                                                                                     (t* 的话不变,n* 的话按操作系统转换;t* 为默认) 。                                                              

Blob,url, base64之间的转化:

Blob和url

  1. //Blob转化为url,必须接受Blob对象
  2. var url = window.URL.createObjectURL(‘必须是BlobFileMediaSource对象’);
  3. //URL.createObjectURL()
  4. //返回一个DOMString ,包含一个唯一的blob链接(该链接协议为以blob:,
  5. //后跟唯一标识浏览器中的对象的掩码)。
  6. //URL.revokeObjectURL()
  7. //销毁之前使用URL.createObjectURL()方法创建的URL实例。
  8. //注:URL对象不兼容低版本浏览器

dataURL转换为Blob对象  dataURL转换为File对象

dataUrl =>截取出base64部分=> Uint8Array()转化 => charCodeAt()转化 => new Blob

  1. function dataURLtoBlob(dataurl) {
  2. var arr = dataurl.split('',''), mime = arr[0].match(/:(.*?);/)[1],
  3. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  4. while(n--){
  5. u8arr[n] = bstr.charCodeAt(n);
  6. }
  7. return new Blob([u8arr], {type:mime});
  8. }
  1. function dataURLtoFile(dataurl, filename) {
  2. var arr = dataurl.split('',''), mime = arr[0].match(/:(.*?);/)[1],
  3. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  4. while(n--){
  5. u8arr[n] = bstr.charCodeAt(n);
  6. }
  7. return new File([u8arr], filename, {type:mime});
  8. }

Blob转为base64

  1. function blobToDataURL(blob, callback) {
  2. let a = new FileReader();
  3. a.onload = function (e) { callback(e.target.result); }
  4. a.readAsDataURL(blob);
  5. }

Blob的三种应用场景

1,分片上传  Blob.slice(start:number, end:number, contentType:string)

2,隐藏视频直链  

3,通过url下载文件

分片上传demo:

  1. var BYTES_PER_CHUNK = 1024 * 1024; // 每个文件切片大小定为1MB .
  2. var blob = document.getElementById("file").files[0];
  3. var slices = Math.ceil(blob.size / BYTES_PER_CHUNK);
  4. var blobs = [];
  5. slices.forEach(function(item, index) {
  6. blobs.push(blob.slice(index,index + 1));
  7. });

隐藏视频连接

  1. var video = document.getElementById("bgvid");
  2. window.URL = window.URL || window.webkitURL;
  3. var xhr = new XMLHttpRequest();
  4. xhr.open("GET", "images/mp4.mp4", true);
  5. xhr.responseType = "blob";
  6. xhr.onload = function() { if (this.status == 200) { var blob = this.response;
  7. video.onload = function(e) { window.URL.revokeObjectURL(video.src); };
  8. video.src = window.URL.createObjectURL(blob); } }
  9. xhr.send();

下载文件:

  1. createDownload("download.txt","download file");
  2. function createDownload(fileName, content){
  3. var blob = new Blob([content]);
  4. var link = document.createElement("a");
  5. link.innerHTML = fileName;
  6. link.download = fileName;
  7. link.href = URL.createObjectURL(blob);
  8. document.getElementsByTagName("body")[0].appendChild(link);
  9. }