上传图片预览实现方案分析

一般有两种方式:
1、window.URL.createObjectURL(file)
2、new FileReader().readAsDataURL(file)

二者对比:

1、返回值
FileReader.readAsDataURL(file)可以得到一段 base64的字符串。
URL.createObjectURL(file)可以得到当前文件的一个 内存URL。

2、内存使用
FileReader.readAsDataURL(file)的返回值是转化后的超长 base64字符串(长度与要解析的文件大小正相关)。
URL.createObjectURL(file)的返回值虽然是字符串,但是是一个 url地址。

3、内存清理
FileReader.readAsDataURL(file)依照JS垃圾回收机制自动从内存中清理。
URL.createObjectURL(file)存在于当前 doucment内,清除方式只有 unload()事件或 revokeObjectURL()手动清除 。

4、执行机制
FileReader.readAsDataURL(file)通过回调的形式返回,异步执行。
URL.createObjectURL(file)直接返回,同步执行。

5、兼容性
兼容性兼容 IE10以上,其他浏览器均支持。

6、其他
FileReader.readAsDataURL(file)当多个文件同时处理时,需要每一个文件对应一个新的 FileReader对象。
URL.createObjectURL(file)依次返回无影响。

7、移动端个别系统如OPPO安卓4.3预览无效。
使用FileReader.readAsDataURL(file),在OPPO安卓4.3上预览不成功。原因是生成的base64编码中无image/png等图片类型。
解决方案:换成使用URL.createObjectURL(file)或在base64前手动添加图片类型解决。
案例见:https://www.cnblogs.com/saysmy/p/5626337.html

8、使用
FileReader.readAsDataURL(file):

<input id="browse" type="file" onchange="previewFiles()" multiple>
<div id="preview"></div>

function previewFiles() {

  var preview = document.querySelector('#preview');
  var files   = document.querySelector('input[type=file]').files;

  function readAndPreview(file) {

    // 确保 `file.name` 符合我们要求的扩展名
    if ( /\.(jpe?g|png|gif)$/i.test(file.name) ) {
      var reader = new FileReader();

      reader.addEventListener("load", function () {
        var image = new Image();
        image.height = 100;
        image.title = file.name;
        image.src = this.result;
        preview.appendChild( image );
      }, false);

      reader.readAsDataURL(file);
    }

  }

  if (files) {
    [].forEach.call(files, readAndPreview);
  }

}

URL.createObjectURL(file):

https://developer.mozilla.org/zh-CN/docs/Web/API/URL/createObjectURL#示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值