• [转] Meida视频加密二-Blob对象


    2. blob

    1
    <video src="blob:http://www.bilibili.com/d0823f0f-2b2a-4fd6-a93a-e4c82173c107"></video>
    • a.什么是blob?

    Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是JavaScript原生格式的数据。 文件(即File)接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。

    要从其他非blob对象和数据构造一个Blob,请使用 Blob() 构造函数。要创建包含另一个blob数据的子集blob,请使用 slice()方法。要获取用户文件系统上的文件对应的Blob对象,

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

    官方:接受Blob对象的API也被列在 File 文档中(下边有file相关内容的部分,继续浏览)。

    MDN-Blob

    Blob属性:

    Blob.size 只读
        Blob 对象中所包含数据的大小(单位为字节)。
    Blob.type 只读
        一个字符串,表明该Blob对象所包含数据的MIME类型。如果类型无法确定,则返回空字符串。
        语法:`var mimetype = instanceOfFile.type`
    
    • b.如何创建Blob

      BlobBuilder 接口提供了另外一种创建Blob对象的方式:使用旧方法创建 Blob 对象。链接地址
      解释:使用 BlobBuilder 来创建一个Blob 实例,并且使用一个 append() 方法,将字符串(或者 ArrayBuffer 或者 Blob,此处用 string 举例)插入,一旦数据插入成功,就可以使用 getBlob() 方法设置一个 mime 。但该方式现在已经废弃,不应继续使用:

      1
      2
      3
      4
      var builder = new BlobBuilder();
      var fileParts = ['<a id="a"><b id="b">hey!</b></a>'];
      builder.append(fileParts[0]);
      var myBlob = builder.getBlob('text/xml');

    Blob构造函数

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

    Blob() 构造函数 允许用其它对象创建 Blob 对象。比如,用字符串构建一个 blob:

    语法: var aBlob = new Blob( array, options );

    参数:

    • array 是一个由ArrayBuffer, ArrayBufferView(TypedArray类型化数组的构造函数), Blob, DOMString 等对象构成的 Array,或者其他类似对象的混合体,它将会被放进Blob。DOMStrings会被编码为UTF-8。

      • ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。ArrayBuffer 不能直接操作,而是要通过类型数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。

        • ArrayBuffer 构造函数用来创建一个指定字节长度的 ArrayBuffer 对象。

          • 以现有数据获取 ArrayBuffer

            1
            2
            3
            4
            5
            6
            function b64EncodeUnicode(str) {
            return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
            return String.fromCharCode('0x' + p1);
            }));
            }
            b64EncodeUnicode('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="
          • FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
            其中File对象可以是来自用户在一个 <input> 元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。

    • options 是一个可选的BlobPropertyBag字典,它可能会指定如下两个属性:

      type,默认值为 "",它代表了将会被放入到blob中的数组内容的MIME类型。
      endings,默认值为"transparent",用于指定包含行结束符
      的字符串如何被写入。 它是以下两个值中的一个: "native",代表行结束符会被更改为适合宿主操作系统文件系统的换行符,或者 "transparent",代表会保持blob中保存的结束符不变
      
    1
    2
    3
    4
    5
    var aFileParts = ['<a id="a"><b id="b">hey!</b></a>']; // 一个包含DOMString的数组
    var oMyBlob = new Blob(aFileParts, {type : 'text/html'}); // 得到 blob

    var debug = {hello: "world"};
    var blob = new Blob([JSON.stringify(debug, null, 2)], {type: 'application/json'});

    File

    通常情况下, File 对象是来自用户在一个 <input> 元素上选择文件后返回的 FileList 对象,也可以是来自由拖放操作生成的 DataTransfer 对象,或者来自 HTMLCanvasElement 上的 mozGetAsFile() API。

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

    • URL.createObjectURL() 
      使用 Blob 创建一个指向类型化数组的URL
    1
    2
    3
    4
    var blob = new Blob([typedArray], {type: "application/octet-binary"});// 传入一个合适的MIME类型
    var url = URL.createObjectURL(blob);
    // 会产生一个类似blob:d3958f5c-0777-0845-9dcf-2cb28783acaf 这样的URL字符串
    // 你可以像使用一个普通URL那样使用它,比如用在img.src上。(MSE)

    从 Blob 中提取数据

    从Blob中读取内容的唯一方法是使用 FileReader。以下代码将 Blob 的内容作为类型数组读取:

    1
    2
    3
    4
    5
    6
    7
    var reader = new FileReader();
    // onabort、onerror、onload、onloadstart、onloadend、onprogress
    reader.addEventListener("loadend", function() {
    // reader.result 包含转化为类型数组的blob
    // 文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。
    });
    reader.readAsArrayBuffer(blob);

    简单说下 FileReader:
    属性:

    • FileReader.error 只读
      一个DOMException,表示在读取文件时发生的错误 。
    • FileReader.readyState 只读
      表示FileReader状态的数字。取值如下:
    常量名描述
    EMPTY 0 还没有加载任何数据
    LOADING 1 数据正在被加载
    DONE 2 已完成全部的读取请求
    • FileReader.result 只读
      文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。
      方法:

      FileReader.abort()

      中止读取操作。在返回时,readyState属性为DONE。
      

      FileReader.readAsArrayBuffer()

      开始读取指定的 Blob中的内容, 一旦完成, result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象.
      

      FileReader.readAsBinaryString()

      开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。
      

      FileReader.readAsDataURL()

      开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容。
      

      FileReader.readAsText()

      开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容。
      

    参考文献:

    http://blog.csdn.net/oscar999/article/details/36373183/

  • 相关阅读:
    学习日记-- 动态性。动态编译,静态方法,包装类
    第一周学习所获———ORM,数据持久化,通过注解来实现数据持久化框架
    第一周学习所获--class类1(反射和类加载过程)
    各种命名规范
    用easyui,json,纯mvc实现一个系统的数据流动过程
    js+bootstrap实现分页页码
    Echarts简单案例
    bootstrap日期控件(双日期、清空等问题解决)
    三种方法实现调用Restful接口
    Spring MVC异常处理 和 重定向传递数据
  • 原文地址:https://www.cnblogs.com/chris-oil/p/8609093.html
Copyright © 2020-2023  润新知