HTML5实现预览本地图片


Posted in HTML / CSS onFebruary 17, 2016

问题描述
假设我们在 HTML 里面有一个图片上传控件:

复制代码
代码如下:

<input id="upload_image" type="file" name="image" accept="image/*" />

注意这个 accept="image/*" 非常重要,它指定了上传的是图片,在移动端的时候会关联到系统的弹窗选择类型等问题,务必加上。
然后,问题是,我们在没有提交这个表单到服务器之前,有没有办法把图片的内容读取出来呢?
看似简单,都是客户端的文件,应该是可以的,但在之前确实没什么好办法,但是自从有了HTML5,这个功能又回来了,通过FileReader可以轻松的实现这个功能。
例子说明问题

复制代码
代码如下:

$(function() {
$('#upload_image').change(function(event) {
// 根据这个 <input> 获取文件的 HTML5 js 对象
var files = event.target.files, file;
if (files && files.length > 0) {
// 获取目前上传的文件
file = files[0];
// 来在控制台看看到底这个对象是什么
console.log(file);
// 那么我们可以做一下诸如文件大小校验的动作
if(file.size > 1024 * 1024 * 2) {
alert('图片大小不能超过 2MB!');
return false;
}
// !!!!!!
// 下面是关键的关键,通过这个 file 对象生成一个可用的图像 URL
// 获取 window 的 URL 工具
var URL = window.URL || window.webkitURL;
// 通过 file 生成目标 url
var imgURL = URL.createObjectURL(file);
// 用这个 URL 产生一个 <img> 将其显示出来
$('body').append($('<img/>').attr('src', imgURL));
// 使用下面这句可以在内存中释放对此 url 的伺服,跑了之后那个 URL 就无效了
// URL.revokeObjectURL(imgURL);
}
});
});

简要说明
简单来说整个操作设计如下几步:
1.通过 <file> 的 change 事件触发事件,并且获取 event 对象;
2.通过 event 对象获取上传的文件的 js 对象 file ;
3.通过 window.URL 工具从 file 对象生成一个可用的 URL;
4.把这个 URL 置入使用;
5.*释放这个 URL 的伺服
关键点:
1.对于同一个 file ,每次调用 URL.createObjectURL 的时候,都会重新生成一个不同的 URL;
2.调用 URL.createObjectURL 的时候,浏览器自动在内存中开辟空间,用于伺服这个 URL,也就是使得这个 URL 可以请求成功;
3.如果调用了 URL.revokeObjectURL(imgURL); 之后,这个伺服就会关掉,再请求这个 URL 就会 404;
4.这一切都是客户端的事情,服务器端对此一无所知,包括你选择的这个图;
5.这个 imgURL 大概是这个样子:blob:http%3A//localhost%3A8000/22cc97d5-5e46-4d87-9df4-c3e8c0aa72bb

HTML / CSS 相关文章推荐
纯CSS3实现3D旋转书本效果
Mar 21 HTML / CSS
CSS3 优势以及网页设计师如何使用CSS3技术
Jul 29 HTML / CSS
利用CSS3制作简单的3d半透明立方体图片展示
Mar 25 HTML / CSS
CSS3 实现发光边框特效
Nov 11 HTML / CSS
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
Apr 10 HTML / CSS
HTML5打开本地app应用的方法
Mar 31 HTML / CSS
html5中localStorage本地存储的简单使用
Jun 16 HTML / CSS
使用phonegap创建联系人的实现方法
Mar 30 HTML / CSS
Canvas实现保存图片到本地的示例代码
Jun 28 HTML / CSS
html5 video全屏播放/自动播放的实现示例
Aug 06 HTML / CSS
Html5同时支持多端sdk的小技巧
Nov 17 HTML / CSS
CSS三大特性继承性、层叠性和优先级详解
Jan 18 HTML / CSS
HTML5新特性之用SVG绘制微信logo
Feb 03 #HTML / CSS
HTML5未来发展趋势
Feb 01 #HTML / CSS
详解HTML5中的Communication API基本使用方法
Jan 29 #HTML / CSS
HTML5中的音频和视频媒体播放元素小结
Jan 29 #HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
Jan 29 #HTML / CSS
Html5 audio标签样式的修改
Jan 28 #HTML / CSS
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
Jan 27 #HTML / CSS
You might like
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
php表单提交问题的解决方法
2011/04/12 PHP
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
详解Python 函数参数的拆解
2020/09/02 Python
pycharm永久激活超详细教程
2020/10/29 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
几个Shell Script面试题
2014/04/18 面试题
Linux开机引导的步骤是什么
2014/02/26 面试题
传播学毕业生求职信
2013/10/11 职场文书
机械个人求职信范文
2014/01/24 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
同学聚会主持词
2014/03/18 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
食品质检员岗位职责
2015/04/08 职场文书
2015年语文教学工作总结
2015/05/25 职场文书
积极心理学课程心得体会
2016/01/22 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript