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中的calc函数浅析
Jul 10 HTML / CSS
CSS3盒子模型详解
Apr 24 HTML / CSS
CSS3中利用animation属性创建雪花飘落特效
May 14 HTML / CSS
CSS3中的transform属性进行2D和3D变换的基本用法
May 12 HTML / CSS
基于HTML5 Canvas 实现商场监控实例详解
Nov 20 HTML / CSS
HTML5 解析规则分析
Aug 14 HTML / CSS
html5 学习简单的拾色器
Sep 03 HTML / CSS
【HTML5】Canvas绘制简单图片教程
May 13 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
Oct 16 HTML / CSS
详解如何通过H5(浏览器/WebView/其他)唤起本地app
Dec 11 HTML / CSS
localStorage的过期时间设置的方法详解
Nov 26 HTML / CSS
使用canvas实现雪花飘动效果的示例代码
Mar 30 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 Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
详解python中的 is 操作符
2017/12/26 Python
Python list运算操作代码实例解析
2020/01/20 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
12月小学生校园广播稿
2014/02/04 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
治超工作实施方案
2014/05/04 职场文书
学校党员对照检查材料
2014/08/28 职场文书
授权收款委托书范本
2014/10/10 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers