HTML5之文件操作全过程(FileReader)

第一步,获取文件

前端中,获取文件必须使用input标签。而获取到这个文件,必须要用代码的方式,体现出来,让你能用代码操作它。这里主要是使用input标签的onchange事件。

<input id='file' type='file' />

var file = document.getELementById('file');
file.onchange = function(e){
    var files = e.target.files;
    //这个files就是获取的file文件的一个数组。之后你可以使用任何方式来操作它。
}

前端在读取到files数组之后,可以对得到的文件一些属性进行读取。这些属性分别是:name、size、type、lastModifiedDate。

var file = files[0];//比如这个file是图片
if(file.size > 5000){
    //处理压缩操作
}

第二步,读取文件(FileReader)

HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型。

1.检测浏览器对FileReader的支持

if(window.FileReader) {
    var fr = new FileReader();
    // add your code here
}else {
    alert("Not supported by your browser!");
}

2. FileReader常用的读取文件的方法

FileReader 的实例拥有 4 个方法,其中 3 个用以读取文件,另一个用来中断读取。需要注意的是 ,无论读取成功或失败,方法并不会返回读取结果,这一结果存储在FileReader监听的读取文件事件的回调函数的result属性中

  • abort: 中断读取文件。
  • readAsText:该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。
  • readAsBinaryString:该方法将文件读取为二进制字符串 ,通常我们将它传送到后端,后端可以通过这段字符串存储文件。
  • readAsDataURL:该方法将文件读取为一段以 data: 开头的字符串,这段字符串的实质就是 Data URL,Data URL是一种将小文件直接嵌入文档的方案 。这里的小文件通常是指图像与 html 等格式的文件。

3. 监听处理文件读取事件(监听文件读取,回调函数返回文件读取结果)

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

监听事件使用案例

var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function(e) {                 
	var body = document.querySelector('body');
	var link = document.createElement('a');
	link.download = filename;
	link.href = e.target.result;         //读取文件成功后返回的文件链接Data URL
	link.style.display = 'none';
	body.appendChild(link);  
	link.click();
	body.removeChild(link);
}

读取文件进度条,通过下面的代码实现


<form>
    <fieldset>
        <legend>分度读取文件:</legend>
        <input type="file" id="File" />
        <input type="button" value="中断" id="Abort" />
        <p>
            <label>读取进度:</label><progress id="Progress" value="0" max="100"></progress>
        </p>
        <p id="Status"></p>
    </fieldset>
</form>

var h = {
    init: function() {
        var me = this;
         
        document.getElementById('File').onchange = me.fileHandler;
        document.getElementById('Abort').onclick = me.abortHandler;
         
        me.status = document.getElementById('Status');
        me.progress = document.getElementById('Progress');
        me.percent = document.getElementById('Percent');
         
        me.loaded = 0;
        //每次读取1M
        me.step = 1024 * 1024;
        me.times = 0;
    },
    fileHandler: function(e) {
        var me = h;
         
        var file = me.file = this.files[0];
         
        var reader = me.reader = new FileReader();
         
        //
        me.total = file.size;
         
        reader.onloadstart = me.onLoadStart;
        reader.onprogress = me.onProgress;
        reader.onabort = me.onAbort;
        reader.onerror = me.onerror;
        reader.onload = me.onLoad;
        reader.onloadend = me.onLoadEnd;
        //读取第一块
        me.readBlob(file, 0);
    },
    onLoadStart: function() {
        var me = h;
    },
    onProgress: function(e) {
        var me = h;
         
        me.loaded += e.loaded;
        //更新进度条
        me.progress.value = (me.loaded / me.total) * 100;
    },
    onAbort: function() {
        var me = h;
    },
    onError: function() {
        var me = h;
         
    },
    onLoad: function() {
        var me = h;
 
        if(me.loaded < me.total) {
            me.readBlob(me.loaded);
        } else {
            me.loaded = me.total;
        }
    },
    onLoadEnd: function() {
        var me = h;
         
    },
    readBlob: function(start) {
        var me = h;
         
        var blob,
            file = me.file;
         
        me.times += 1;
         
        if(file.webkitSlice) {
            blob = file.webkitSlice(start, start + me.step + 1);
        } else if(file.mozSlice) {
            blob = file.mozSlice(start, start + me.step + 1);
        }
         
        me.reader.readAsText(blob);
    },
    abortHandler: function() {
        var me = h;
         
        if(me.reader) {
            me.reader.abort();
        }
    }
};
 
h.init();

转载链接 https://blog.csdn.net/jackfrued/article/details/8967667
转载链接 https://blog.csdn.net/mapbar_front/article/details/78632928

发布了88 篇原创文章 · 获赞 13 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/yiyueqinghui/article/details/104626186