3分钟上手JS中的FileReader对象(实现上传图片预览)

详见原文:
https://www.cnblogs.com/LO-gin/p/6817319.html

方法一:使用js的FileReader对象
1、FileReader对象简介
检测浏览器对FileReader的支持

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

调用FileReader对象的方法

FileReader 的实例拥有 4 个方法,其中 3 个用以读取文件,另一个用来中断读取。下面的表格列出了这些方法以及他们的参数和功能,

需要注意的是 ,无论读取成功或失败,方法并不会返回读取结果,这一结果存储在 result属性中。


1575299829(1).png

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

  1. FileReader处理事件简介
    FileReader 包含了一套完整的事件模型,用于捕获读取文件时的状态,下面这个表格归纳了这些事件。


    1575299617(1).jpg

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

fr.onload = function() { 
    this.result; 
}; 

例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FileReader</title>
</head>
<body>
    <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> 


<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> 

</body>
</html>

3 、使用js的FileReader对象实现上传图片时的图片预览功能

<!DOCTYPE html>
<html>
   <head>
   <meta  name="viewport"  content="width=device-width,initial-scale=1, user-scalable=no">
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <meta name="format-detection" content="telephone=no">
   <title>test</title>
   <script>
    //选择图片时预览功能
    function imageshow(source){
                   var file = source.files[0];
                   var imageid = source.id;
                   if (window.FileReader) {
                       var fr = new FileReader();
                       fr.onloadend = function(e) {
                          document.getElementById("portrait"+imageid).src = e.target.result;
                       };
                       fr.readAsDataURL(file);
                  }
    document.getElementById("image"+imageid).style.display="none";
       document.getElementById("show"+imageid).style.display="block";
      }
  </script>
  </head>
<body>
<div>
      <div id="image1" >
      <p>上传截图</p>
          <input type="file" name="screenshot1" id="1" onchange="imageshow(this)"/>
      </div>
    <div id="show1" style="display:none;">
      <img  src="" id="portrait1" width="100" height="70">
    </div>
    <div id="image2">
          <p>上传截图</p>
          <input type="file" name="screenshot2" id="2" onchange="imageshow(this)"/>
      </div>
    <div id="show2" style="display:none;">
      <img  src="" id="portrait2" width="100" height="70">
   </div>
         <div id="image3">
            <p>上传截图</p>
            <input type="file" name="screenshot3" id="3" onchange="imageshow(this)"/>
         </div>
      <div id="show3" style="display:none;">
      <img  src="" id="portrait3" width="100" height="70" >
    </div>
</div> 
</body>
</html>

方法二:使用window.createObjectURL

<!DOCTYPE html> 
<html> 
<head> 
<title>图片上传预览</title> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<script src="http://www.codefans.net/ajaxjs/jquery-1.6.2.min.js"></script> 
</head> 
<body> 
<form name="form0" id="form0" > 
<input type="file" name="file0" id="file0" multiple="multiple" />
<br>
<img src="" width="100" height="100" id="img0" > 
</form> 
<script> 
$("#file0").change(function(){ 
  var objUrl = getObjectURL(this.files[0]) ; 
  console.log("objUrl = "+objUrl) ; 
  if (objUrl) { 
    $("#img0").attr("src", objUrl) ; 
  } 
}) ; 

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