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 相关文章推荐
详解Sticky Footer 绝对底部的两种套路
Nov 03 HTML / CSS
详解CSS 3 中的 calc() 方法
Jan 12 HTML / CSS
使用HTML5的链接预取功能(link prefetching)给网站提速
Dec 13 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
Dec 26 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
Feb 19 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
Oct 16 HTML / CSS
Html5原生拖拽相关事件简介以及基础实现
Nov 19 HTML / CSS
CSS3点击按钮圆形进度打钩效果的实现代码
Mar 30 HTML / CSS
CSS3 实现的图片悬停的切换按钮
Apr 13 HTML / CSS
css3实现背景图片半透明内容不透明的方法示例
Apr 13 HTML / CSS
Canvas绘制像素风图片的示例代码
Sep 25 HTML / CSS
css filter和getUserMedia的联合使用
Feb 24 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
php 图片上传类代码
2009/07/17 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
php编写简单的文章发布程序
2015/06/18 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
Javascript 入门基础学习
2010/03/10 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
python WindowsError的错误代码详解
2017/07/23 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Python 编程速成(推荐)
2019/04/15 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
应付会计岗位职责
2013/12/12 职场文书
和解协议书
2014/04/16 职场文书
党校党性分析材料
2014/12/19 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
办公用品管理制度
2015/08/04 职场文书
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers