浅谈HTML5 FileReader分布读取文件以及其方法简介


Posted in HTML / CSS onNovember 09, 2017

本文介绍了浅谈HTML5 FileReader分布读取文件以及其方法简介,分享给大家。具体如下:

效果图

老规矩先上效果图

浅谈HTML5 FileReader分布读取文件以及其方法简介

先介绍一下H5中FileReader的一些方法以及事件

FileReader方法

名称 作用
about() 终止读取
readAsBinaryString(file) 将文件读取为二进制编码
readAsDataURL(file) 将文件读取为DataURL编码
readAsText(file, [encoding]) 将文件读取为文本
readAsArrayBuffer(file)​​​​​​​ 将文件读取为arraybuffer

FileReader事件

名称 作用
onloadstart 读取开始时触发
onprogress 读取中
onloadend 读取完成触发,无论成功或失败
onload 文件读取成功完成时触发
onabort 中断时触发
onerror 出错时触发

代码

分布读取文件核心思想, 将文件分块以每M进行读取.

HTML部分

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <form>
        <fieldset>
            <legend>分步读取文件:</legend>
            <input type="file" id="File">
            <input type="button" value="中断" id="Abort">
            <p>
                <lable>读取进度:</lable>
                <progress id="Progress" value="0" max="100"></progress>
            </p>
        </fieldset>
    </form>
    <script src="./loadFile.js"></script>
    <script>

            var progress = document.getElementById('Progress');//进度条

            var events = {
                load: function () {
                    console.log('loaded');
                },
                progress: function (percent) {
                    console.log(percent);
                    progress.value = percent;
                },
                success: function () {
                    console.log('success');
                }
            };
            var loader;

            // 选择好要上传的文件后触发onchange事件
            document.getElementById('File').onchange = function (e) {
                var file = this.files[0];
                console.log(file)

                //loadFile.js
                loader = new FileLoader(file, events);
            };

            document.getElementById('Abort').onclick = function () {
                loader.abort();
            }
        </script>
</body>
</html>

loadFile.js部分

/*
* 文件读取模块
* file  文件对象
* events 事件回掉对象 包含 success , load, progress
*/
var FileLoader = function (file, events) {
    this.reader = new FileReader();
    this.file = file;
    this.loaded = 0;
    this.total = file.size;
    //每次读取1M
    this.step = 1024 * 1024;
    this.events = events || {};
    //读取第一块
    this.readBlob(0);
    this.bindEvent();  
}

FileLoader.prototype = {
    bindEvent: function (events) {
        var _this = this,
            reader = this.reader;

        reader.onload = function (e) {
            _this.onLoad();
        };

        reader.onprogress = function (e) {
            _this.onProgress(e.loaded);
        };

        // start 、abort、error 回调暂时不加
    },
    // progress 事件回掉
    onProgress: function (loaded) {
        var percent,
            handler = this.events.progress;//进度条

        this.loaded += loaded;
        percent = (this.loaded / this.total) * 100;
        handler && handler(percent);
    },
    // 读取结束(每一次执行read结束时调用,并非整体)
    onLoad: function () {
        var handler = this.events.load;

        // 应该在这里发送读取的数据
        handler && handler(this.reader.result);



        // 如果未读取完毕继续读取
        if (this.loaded < this.total) {
            this.readBlob(this.loaded);
        } else {
            // 读取完毕
            this.loaded = this.total;
            // 如果有success回掉则执行
            this.events.success && this.events.success();
        }
    },
    // 读取文件内容
    readBlob: function (start) {
        var blob,
            file = this.file;

        // 如果支持 slice 方法,那么分步读取,不支持的话一次读取
        if (file.slice) {
            blob = file.slice(start, start + this.step);
        } else {
            blob = file;
        }

        this.reader.readAsText(blob);
    },
    // 中止读取
    abort: function () {
        var reader = this.reader;

        if(reader) {
            reader.abort();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
纯CSS3实现Material Design效果
Mar 09 HTML / CSS
基于css3仿造window7的开始菜单
Jun 17 HTML / CSS
CSS3的常见transformation图形变化用法小结
May 13 HTML / CSS
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
Sep 15 HTML / CSS
HTML+CSS3+JS 实现的下拉菜单
Nov 25 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
Dec 30 HTML / CSS
HTML5的hidden属性兼容老浏览器的方法
Apr 23 HTML / CSS
HTML5新特性 多线程(Worker SharedWorker)
Apr 24 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
Nov 22 HTML / CSS
HTML5触摸事件(touchstart、touchmove和touchend)的实现
May 08 HTML / CSS
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
Jan 18 HTML / CSS
CSS使用Flex和Grid布局实现3D骰子
Aug 05 HTML / CSS
如何避免常见的6种HTML5错误用法
Nov 06 #HTML / CSS
HTML5添加禁止缩放功能
Nov 03 #HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
Nov 02 #HTML / CSS
HTML5新特性之语义化标签
Oct 31 #HTML / CSS
解决HTML5手机端页面缩放的问题
Oct 27 #HTML / CSS
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
Oct 26 #HTML / CSS
HTML5 文件域+FileReader 分段读取文件并上传到服务器
Oct 23 #HTML / CSS
You might like
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
jQuery提交多个表单的小例子
2013/06/30 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
德语专业求职信
2014/03/12 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
服务行业口号
2014/06/11 职场文书
节能环保口号
2014/06/12 职场文书
运动会宣传语
2015/07/13 职场文书
高中生军训感言
2015/08/01 职场文书
中秋节主题班会
2015/08/14 职场文书
企业法人任命书
2015/09/21 职场文书
Pytest中conftest.py的用法
2021/06/27 Python