原文地址:http://zhangyiheng.com/blog/articles/img_preview.html

本文主要介绍如何通过拖拽方式在浏览器端实现图片预览,并生成图片的Base64编码。 工具链接:图片转Base64

首先介绍一下FileReader, FileReader对象允许浏览器使用File或Blob对象异步读取存储在用户计算机上的文件(或数据缓冲区)的内容。

有了FileReader就不需要先把文件发送到服务器端,然后再返回到浏览器端显示这种模式了,可以直接在浏览器端读取文件并显示。

DND获取文件

通过对DragAndDrop事件的监听获取文件。

z.event.on(listDiv, "dragenter", this.preventAndStop, this);
z.event.on(listDiv, "dragover", this.preventAndStop, this);
z.event.on(listDiv, "drop", this.handleDrop, this);

加dragenter和dragover监听主要是防止默认拖拽行为的发生,可以防止浏览器将当前页面变成浏览拖拽进来的图片内容。

在drop事件监听中,可以通过dataTransfer获取拖拽到当前区域的文件列表。

var dt = evt.dataTransfer;
var files = dt.files;
this.readFiles(files);

FileReader读取文件

通过FileReader对象读取文件, 因为FileReader读取文件是异步操作,所以通过onload事件回调来获取读取到的文件内容。

var img = z.dom.create("img", "item");
var reader = new FileReader();
reader.onload = function (e) {
img.src = e.target.result;
}
reader.readAsDataURL(file);

这样用户计算机中的图片文件,就可以在浏览器中预览看到了。

在此通过文件的type做了一些过滤,只读取图片类型的文件,具体实现请参考完成代码。

生成Base64

FileReader读取到的内容,其实就是文件的Base64编码内容,可以直接通过img.src来访问。

完整代码

/**
* Created by taozh on 2017/11/22.
*/
var ToBase64 = {
init: function () {
this.initController();
},
initController: function () {
var listDiv = z.dom.get("#listDiv");
z.event.on(listDiv, "dragenter", this.preventAndStop, this);
z.event.on(listDiv, "dragover", this.preventAndStop, this);
z.event.on(listDiv, "drop", this.handleDrop, this);
z.event.on(listDiv, "click", this.handleClick, this);
},
preventAndStop: function (evt) {
evt.stopPropagation();
evt.preventDefault();
}, handleDrop: function (evt) {
this.preventAndStop(evt);
var dt = evt.dataTransfer;
var files = dt.files;
this.readFiles(files);
},
readFiles: function (files) {
var len = files.length;
for (var i = 0; i < len; i++) {
var file = files[i];
var imageType = /image.*/; if (!file.type.match(imageType)) {
continue;
}
var img = this.addImage(file); if (i === 0) {
this.setCurrent(img);
}
}
},
addImage: function (file) {
var that = this;
var img = z.dom.create("img", "item");
img.file = file;
z.dom.attr(img,"title",file.name);
z.dom.css(img, "display", "none");
var span = z.dom.create("span");
z.dom.get("#listDiv").appendChild(img); var reader = new FileReader();
reader.onerror = function (stuff) {
console.log("error", stuff);
console.log(stuff.getMessage());
};
reader.onload = function (e) {
img.src = e.target.result; z.util.callLater(function () {
var naturalHeight = img.naturalHeight;
var naturalWidth = img.naturalWidth;
if (naturalHeight > 0 && naturalWidth > 0) {
var m = Math.max(naturalWidth, naturalHeight) / 110;
z.dom.css(img, {
width: naturalWidth / m + "px",
height: naturalHeight / m + "px"
})
}
z.dom.css(img, "display", "inline");
if (that.__currentImg === img) {
z.dom.val("#dataPre", img.src);
img.scrollIntoView();
}
}, 200);
};
reader.readAsDataURL(file);
return img;
},
setCurrent: function (img) {
if (this.__currentImg === img) {
return;
}
if (this.__currentImg) {
z.dom.removeClass(this.__currentImg, "active");
z.dom.val("#dataPre", "");
}
this.__currentImg = img;
if (img) {
z.dom.cls(img, "active");
z.dom.val("#dataPre", img.src);
} },
handleClick: function (evt) {
var target = z.event.getTarget(evt);
if (z.dom.hasClass(target, "item")) {
this.setCurrent(target);
}
} };
z.ready(function () {
ToBase64.init();
});

工具链接:图片转Base64

工具效果图:

HTML5浏览器端图片预览&生成Base64的更多相关文章

  1. js实现移动端图片预览:手势缩放, 手势拖动,双击放大...

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  2. 适用于各浏览器支持图片预览,无刷新异步上传js插件

    文件上传无疑是web应用中一个非常常用的功能,不管是PHP.jsp还是aspx.mvc等都会需要文件上传,但是众所周知当使用自带的文件上传功能时总会出现页面刷新的情况.当然现在有了html5这个好东西 ...

  3. 记一次IE浏览器做图片预览的坑

    随便写写吧,被坑死了 IE 10 及 IE10以上,可以使用FileReader的方式,来做图片预览,加载本地图片显示 IE 9 8 7 没有FileReader这个对象,所以只能使用微软自己的东西来 ...

  4. jQuery PC端图片预览,鼠标移上去查看大图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Vue PC端图片预览插件

    *手上的项目刚刚搞完了,记录一下项目中遇到的问题,留做笔记: 需求: 在项目中,需要展示用户上传的一些图片,我从后台接口拿到图片url后放在页面上展示,因为被图片我设置了宽度限制(150px),所以图 ...

  6. 关于图片预览使用base64在chrome上的性能问题解决方法

    在开发后台上传图片的功能时候使用base64预览图片,结果在传入大量图片后导致chrome崩溃,代码如下 var img = new Image(); var render = new FileRea ...

  7. jquery+html5+canvas实现图片 预览 压缩 上传

    javascirpt (function($){ $.fn.extend({ aiiUpload:function(obj) { if(typeof obj !="object") ...

  8. jq移动端图片预览 (fly-zomm-img.js)

    效果图: ===>==> 里面还与很多属性设置: index  关闭按钮等等 代码: //html-----------------------<div class="he ...

  9. 兼容ie[6-9]、火狐、Chrome、opera、maxthon3、360浏览器的js本地图片预览

    html代码: <div id="divPreview"> <img id="imgHeadPhoto" src="Images/H ...

随机推荐

  1. mongodb生产环境(副本集模式)集群搭建配置

    mongodb副本集模式由如下几部分组成: 1.路由实例mongos 2.配置实例configsvr 3.副本集集群replset(一主多从) tips: 1.以上实例都是mongod守护进程 2.以 ...

  2. oracle11G r2 静默安装单实例(待优化版)

    测试环境:centos 6.9 X64 mini 版 oracle版本:11G r2 Oracle软件包:db_112040_Linux-x86-64_1of7.zip;db_112040_Linux ...

  3. node+vue进阶【课程学习系统项目实战详细讲解】打通前后端全栈开发(1):创建项目,完成登录功能

    第一章 建议学习时间8小时·分两次学习      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章]) 视频教程地 ...

  4. Java限流策略

    概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃.此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待.排队. ...

  5. (MariaDB)MySQL数据类型详解和存储机制

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  6. 理解JDK1.5的自动装箱拆箱

    JDK1.5的升级引入了装箱和拆箱概念,简单说就是为了简化书写. JDK1.5之前,创建Integer对象是需要这么写的  Integer i = new Integer("3") ...

  7. Call From master/192.168.128.135 to master:8485 failed on connection exception: java.net.ConnectException: Connection refused

    hadoop集群搭建了ha,初次启动正常,最近几天启动时偶尔发现,namenode1节点启动后一段时间(大约10几秒-半分钟左右),namenode1上namenode进程停掉,查看日志: -- :: ...

  8. js原生API妙用(一)

    复制数组 我们都知道数组是引用类型数据.这里使用slice复制一个数组,原数组不受影响. let list1 = [1, 2, 3, 4]; let newList = list1.slice(); ...

  9. PyCharm 如何安装python第三方库及插件

    一.如何安装python第三方库: 1.有一个专门可下载安装第三方库的网址: http://www.lfd.uci.edu/~gohlke/pythonlibs/ Ctrl+f 搜索要下载的第三方库, ...

  10. 在XUnit中用Moq怎样模拟EntityFramework Core下的DbSet

    最近在做一个项目的单元测试时,遇到了些问题,解决后,觉得有必要记下来,并分享给需要的人,先简单说一下项目技术框架背景: asp.net core 2.0(for .net core)框架 用Entit ...