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中的注音对齐属性ruby-align用法指南
Jul 01 HTML / CSS
IE滤镜与CSS3效果(详细整理分享)
Jan 25 HTML / CSS
css3隔行变换色实现示例
Feb 19 HTML / CSS
CSS3实现3D翻书效果
Jun 20 HTML / CSS
HTML5标签小集
Aug 02 HTML / CSS
一款利用html5和css3动画排列人物头像的实例演示
Dec 05 HTML / CSS
html5使用canvas绘制一张图片
Dec 15 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
Dec 15 HTML / CSS
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
Dec 16 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
Dec 29 HTML / CSS
详解移动端h5页面根据屏幕适配的四种方案
Apr 15 HTML / CSS
CSS3实现列表无限滚动/轮播效果
Jun 23 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系统类函数
2015/10/21 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
ie支持function.bind()方法实现代码
2012/12/27 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
2014/12/31 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
JQuery控制Radio选中方法分析
2015/05/29 Javascript
详解JavaScript函数
2015/12/01 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
2017/07/27 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
python判断字符串是否纯数字的方法
2014/11/19 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python进程间通信用法实例
2015/06/04 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
Python  Django 母版和继承解析
2019/08/09 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
农村婚庆司仪主持词
2014/03/15 职场文书
施工安全生产承诺书
2014/05/23 职场文书
冬季安全检查方案
2014/05/23 职场文书
励志演讲稿800字
2014/08/21 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
高校教师个人总结
2015/02/10 职场文书
校运会通讯稿
2015/07/18 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书
Selenium浏览器自动化如何上传文件
2022/04/06 Python