• 浅谈FileReader


    FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 FileBlob 对象指定要读取的文件或数据。

    了解 https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

    1、FileReader对象的方法
    FileReader 的实例拥有 4 个方法,其中 3 个用以读取文件,另一个用来中断读取。无论读取成功或失败,方法并不会返回读取结果,这一结果存储在 result属性中。

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

    2、. 处理事件
    FileReader 包含了一套完整的事件模型,用于捕获读取文件时的状态。

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


    文件一旦开始读取,无论成功或失败,实例的 result 属性都会被填充。如果读取失败,则 result 的值为 null ,否则即是读取的结果,绝大多数的程序都会在成功读取文件的时候,抓取这个值。

    读取文件代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <script type="text/javascript">
        var result=document.getElementById("result");
        var file=document.getElementById("file");
    
        //判断浏览器是否支持FileReader接口
        if(typeof FileReader == 'undefined'){
            result.InnerHTML="<p>你的浏览器不支持FileReader接口!</p>";
            //使选择控件不可操作
            file.setAttribute("disabled","disabled");
        }
    
        function readAsDataURL(){
            //检验是否为图像文件
            var file = document.getElementById("file").files[0];
            if(!/image/w+/.test(file.type)){
                alert("看清楚,这个需要图片!");
                return false;
            }
            var reader = new FileReader();
            //将文件以Data URL形式读入页面
            reader.readAsDataURL(file);
            reader.onload=function(e){
                var result=document.getElementById("result");
                //显示文件
                result.innerHTML='<img src="' + this.result +'" alt="" />';
            }
        }
    
        function readAsBinaryString(){
            var file = document.getElementById("file").files[0];
            var reader = new FileReader();
            //将文件以二进制形式读入页面
            reader.readAsBinaryString(file);
            reader.onload=function(f){
                var result=document.getElementById("result");
                //显示文件
                result.innerHTML=this.result;
            }
        }
    
        function readAsText(){
            var file = document.getElementById("file").files[0];
            var reader = new FileReader();
            //将文件以文本形式读入页面
            reader.readAsText(file);
            reader.onload=function(f){
                var result=document.getElementById("result");
                //显示文件
                result.innerHTML=this.result;
            }
        }
    </script>
    <p>
        <label>请选择一个文件:</label>
        <input type="file" id="file" />
        <input type="button" value="读取图像" onclick="readAsDataURL()" />
        <input type="button" value="读取二进制数据" onclick="readAsBinaryString()" />
        <input type="button" value="读取文本文件" onclick="readAsText()" />
    </p>
    <div id="result" name="result"></div>
    </body>
    </html>

    简单的上传实例

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>html5filereader上传图片</title>
        <script type="text/javascript">
            var loadImageFile = (function () {
                if (window.FileReader) {
                    var    oPreviewImg = null,
                            oFReader = new window.FileReader(),//创建对象
                            rFilter = /^(?:image/bmp|image/cis-cod|image/gif|image/ief|image/jpeg|image/jpeg|image/jpeg|image/pipeg|image/png|image/svg+xml|image/tiff|image/x-cmu-raster|image/x-cmx|image/x-icon|image/x-portable-anymap|image/x-portable-bitmap|image/x-portable-graymap|image/x-portable-pixmap|image/x-rgb|image/x-xbitmap|image/x-xpixmap|image/x-xwindowdump)$/i;
                    oFReader.onload = function (oFREvent) {
                        console.log(!oPreviewImg);//true
                        if (!oPreviewImg) {
                            var newPreview = document.getElementById("imagePreview");
                            oPreviewImg = new Image();
                            oPreviewImg.style.width = (newPreview.offsetWidth).toString() + "px";
                            oPreviewImg.style.height = (newPreview.offsetHeight).toString() + "px";
                            newPreview.appendChild(oPreviewImg);
                        }
                        oPreviewImg.src = oFREvent.target.result;
                        document.getElementById('result').innerHTML="<img src='"+oFREvent.target.result+"'>"
                    };
    
                    return function () {
                        var aFiles = document.getElementById("imageInput").files;
                        console.log(aFiles);
                        if (aFiles.length === 0) { return; }
                        if (!rFilter.test(aFiles[0].type)) { alert("You must select a valid image file!"); return; }
                        oFReader.readAsDataURL(aFiles[0]);
                    }
                }
                if (navigator.appName === "Microsoft Internet Explorer") {
                    return function () {
                        document.getElementById("imagePreview").filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = document.getElementById("imageInput").value;
    
                    }
                }
            })();
        </script>
        <style type="text/css">
            #imagePreview {
                 160px;
                height: 120px;
                float: right;
                filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);
            }
        </style>
    </head>
    
    <body>
    <div id="imagePreview"></div>
    
    <form name="uploadForm">
        <div id="result"></div>
        <p><input id="imageInput" type="file" name="myPhoto" onchange="loadImageFile();" /><br />
            <input type="submit" value="Send" /></p>
    </form>
    </body>
    </html>
  • 相关阅读:
    右值和move 与 forward
    C++11的chrono库,实现毫秒微秒级定时
    HDOJ 1176 免费馅饼(完全背包)
    HDU 1069 Monkey and Banana
    杭电 1003 Max Sum (动态规划)
    UVA ~ 514 ~ Rails (栈)
    UVA 679
    UVA11988 Broken Keyboard (a.k.a. Beiju Text)【数组模拟链表】
    Codeforces 845 C Two TVs
    codeforces 845A Chess Tourney
  • 原文地址:https://www.cnblogs.com/zhaixr/p/7494400.html
Copyright © 2020-2023  润新知