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实现的几个小loading效果
Sep 27 HTML / CSS
细说CSS3中的选择符
Oct 17 HTML / CSS
详解CSS3中强大的filter(滤镜)属性
Jun 29 HTML / CSS
浅谈css3新单位vw、vh、vmin、vmax的使用详解
Dec 01 HTML / CSS
利用css3径向渐变做一张优惠券的示例
Mar 22 HTML / CSS
HTML5 Web 存储详解
Sep 16 HTML / CSS
详解FireFox下Canvas使用图像合成绘制SVG的Bug
Jul 10 HTML / CSS
HTML5教程之html 5 本地数据库(Web Sql Database)
Apr 03 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
Jan 20 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
Jul 29 HTML / CSS
html5移动端自适应布局的实现
Apr 15 HTML / CSS
html中两种获取标签内的值的方法
Jun 10 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
SSI指令
2006/11/25 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
js的onload事件及初始化按钮事件示例代码
2013/09/25 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
javascirpt实现2个iframe之间传值的方法
2016/06/30 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
Python制作爬虫抓取美女图
2016/01/20 Python
python去除字符串中的换行符
2017/10/11 Python
Python iter()函数用法实例分析
2018/03/17 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
Python字符串对象实现原理详解
2019/07/01 Python
Python Django view 两种return的实现方式
2020/03/16 Python
机修工岗位职责
2013/11/24 职场文书
商铺租赁意向书
2014/04/01 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
营销计划书
2015/01/17 职场文书
审美与表现自我评价
2015/03/09 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis