最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 理解web文件操作的全过程(Blob, File, ArrayBuffer)

    正文概述 掘金(jiemicc)   2021-08-21   788

    相关文件接口

    • ArrayBuffer: 表示通用的、固定长度的原始二进制数据缓冲区(无法操纵其内部的原始二进制数据)
    • Blob(binary large object):代表不可更改的原始二进制数组,并可以以字节的方式去访问blob对象
    • File:包含了文件的信息化属性,包括文件名称和最近修改时间等等,本身是blob的子类
    • FileList:基础文件系统被选择的独立文件数组,即File对象的数组
    • FileReader:提供方法去访问file和blob对象,并提供相应的事件机制去获取读操作的结果,以异步的方式进行,不阻碍UI渲染和JS执行。
    • URL scheme:用于文件等类型的二进制数组,使之可以在web应用中以引用(url 链接)方式访问

    文件操作流程

    理解web文件操作的全过程(Blob, File, ArrayBuffer) 文件操作基本方式:

    1. 用户使用input元素接口访问文件系统,获取由file对象组成的fileList文件列表。
    2. 通过fileReader对象访问file对象,fileReader提供相应方法和对应的事件模型监听文件读取。
    3. file对象基于Blob类型, 继承使用Blob的相应方法转化为Arraybuffer类型,也同样可以转化为url引用,以链接的方式访问
    4. xhr.send()方法支持blob和arrayBuffer格式, 故file对象可以作为send方法参数传入,将文件上传至服务器

    重要接口介绍

    • Blob 不可变、原始数据的类文件对象

      个人理解 Blob不同于ArrayBuffer只表示二进制数据,还暴露了在宏观上处理二进制数据的方法

      疑难点解析:

      1.Blob.text() 映射为utf-8的字符串(utf-8是一种编码规范,相当于数值和字符之间的映射关系,其中“8”代表编码最少一字节,可兼容ASCII编码)

      2.Blob.arrayBuffer() 转换为二进制数据的arrayBuffer

    • fileReader 异步读取file或者blob对象所指代的文件或数据

      相比于blob使用本身的方法转化为其他格式的数据,fileReader方法提供了更多的格式选择和流程控制以及更好的 兼容性(支持IE)

    深入二进制的世界

    众所周知,计算机是二进制的世界,任何一个字符都只是二进制数字的映射表达,例如ASCII编码 ‘A’以二进制格式表示:ob10000001,而我们所见的十进制数值同理存储时也是用二进制的方式。

    上述的blob对象虽可以宏观上处理二进制数据(比如说格式转化和slice切割),但并不能处理其内部真正的二进制数据(例如访问和赋值),而arrayBuffer虽表示原始且固定的二进制数据,但不能操作其内容,那arrayBuffer的作用是什么呢?

    javascript引入了类型化数组的概念,提供了访问原始二进制内容的能力,类型化数组是类数组对象,类似于NodeList,arguments等等。 类型化数组为了提高灵活性和扩展性,将访问二进制的实现拆分为缓冲和视图。缓冲即arrayBuffer,定义你想要的存储空间,而视图(即TypedArray)提供对缓冲的访问。

    以下是类型化数组对缓冲的访问拆分

    注: 类型化数组是一类构造函数的总称,构造函数的名称表达视图在缓冲上的分拆规则,例如 构造函数UInt32Array 其中的'32'代表每个元素占32bit(4byte),故缓冲区以4byte单位进行视图划分

    下面我们使用类型化数组实现一下简单的二进制访问

       // 先创建一个ArrayBuffer实例,并分配32字节的空间
       const buffer = new ArrayBuffer(32)
       // 看一下二进制缓存大小
       console.log(buffer.byteLength)  // 32 
       // 建立基于buffer的视图 (每个数组元素占32bit(=4byte),Int代表整数类型),所以数组共四个元素
       const view = new Int32Array(buffer)
       // 访问二进制内部
       for (let index = 0; index < view.length; index++) {
         view[index] = index + 1
       }
       // 看看结果怎么样
       console.log(Array.prototype.join.call(view,'')) // 12345678
       
    

    这是类型化数组的简单介绍,具体可以看MDN文档和ECMA规范


    起源地下载网 » 理解web文件操作的全过程(Blob, File, ArrayBuffer)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元