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实现的竖形二级导航的实例教程
Dec 11 HTML / CSS
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
Sep 15 HTML / CSS
CSS3实现线性渐变用法示例代码详解
Aug 07 HTML / CSS
canvas基础之图形验证码的示例
Jan 02 HTML / CSS
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
Apr 24 HTML / CSS
利用HTML5画出一个坦克的形状具体实现代码
Jun 20 HTML / CSS
5 个强大的HTML5 API 函数推荐
Nov 19 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
Oct 17 HTML / CSS
Canvas 像素处理之改变透明度的实现代码
Jan 08 HTML / CSS
解析浏览器的一些“滚动”行为鉴赏
Sep 16 HTML / CSS
css弧边选项卡的项目实践
May 07 HTML / CSS
box-shadow单边阴影的实现
May 21 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
PHP实现MySQL更新记录的代码
2008/06/07 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
对于PHP 5.4 你必须要知道的
2013/08/07 PHP
javascript new 需不需要继续使用
2009/07/02 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
关于COOKIE个数与大小的问题
2011/01/17 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
2019/08/09 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
python3 深浅copy对比详解
2019/08/12 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
机电专业个人求职信范文
2013/12/30 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
购房委托书范本
2014/09/18 职场文书
寒假生活随笔
2015/08/15 职场文书
Python基础之hashlib模块详解
2021/05/06 Python