对HTML5 File 对象的读写组件编写

最近几天在项目里面要在前端对文件进行加密操作之后再上传到后端,需要先从File对象中读出数据进行加密然后再生成一个新的File对象,自然就要用到 HTML5 的 FileReader 来处理。之前也写过一个分块读文件的组件,但是回去读了一下代码觉得设计的很不好,本来应该用单例却硬生生用了一个class,而且还仅仅只有读文件的操作,没有写文件。

去npm上看了一下,好像也没有完全符合需求的组件,没办法,就自己写了一个,现在放到npm上面去了。

github: https://github.com/sallerli1/html5-file-js
npm: https://www.npmjs.com/package/html5-file-js

安装

npm install html5-file-js

使用

具体的用法在ReadMe中都有写到,就不废话了。

思路分享

大部分代码都还是很简单的就一一拿出来说了,分享一下自己的学习成果吧

readChucks 的链式读取

这个链式读取主要是对Blob对象进行分割,利用闭包保存当前的读取进度和下一步需要分割的起点,在FileReader的 onload 事件中判断是否需要读取完成,未完成则继续分割下一部分进行读取。在代码中完全舍弃掉了 onerror 事件来处理异常的方法,而是将 FileReader 的error属性传入回掉函数进行处理,在外部调用就变得简单了很多,内部也少了不少代码,但是没有具体测试,不知道会发生什么不可预测的问题。

promisify

这回写的组件全部提供了 promisified 的调用方法,说来也很简单,就是返回一个 Promise 对象,在回调函数中判断如果没有异常则 resolve,有异常就 reject。(突然想起来前段时间面试官问我Promise有几种状态,明明有3中我却说了两种,面试官还没提出质疑,太给面子了)这样的好处当然很多,书写简单且易维护,还能避免由于异步执行而产生的错误。

写入File

现在只支持写入一个字符串或者写入一个 ArrayBuffer。
写字符串比较简单,读出原来File中的字符串然后拼接起来再 new 一个 File 对象就好了(new 了无数个对象了,就是没有对象!!!)。
写 ArrayBuffer 就要读出原来 File 中的 buffer,对两个 buffer 都取一个 Uint8Array 的 TypedArray,然后针对这两个buffer的长度新建一个ArrayBuffer,再前后把两个 buffer 写进去再 new 一个 File 对象(实在不想多写字了)

待解决的问题

分段读取文件为字符串时编码问题

分段读取文件的时候总是有可能从某一个字符中间切分开,而每一小段数据又会单独运行回调函数,就导致了在段尾出现乱码的问题,由于本人对编码了解实在太少,尚不能得出一个有效的解决办法。

还没有引入 Worker

考虑到文件的读写实际上是很消耗资源的操作,最好是使用 Worker 多线程进行处理,但是实测过,如果没有对文件进行加密等复杂操作,只是读取文件,读取的速度比起DOM操作的速度可是能快上100倍以上,而Worker又不能解决DOM操作速度的问题,就先没有引入Worker。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容