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中文字镂空、透明值、阴影效果设置示例小结
Mar 07 HTML / CSS
利用CSS3的定位页面元素
Aug 29 HTML / CSS
分享CSS3中必须要知道的10个顶级命令
Apr 26 HTML / CSS
CSS3的Border-radius轻松制作圆角
Dec 24 HTML / CSS
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
May 17 HTML / CSS
Html5实现用户注册自动校验功能实例代码
May 24 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
Dec 20 HTML / CSS
HTML5 canvas 瀑布流文字效果的示例代码
Jan 31 HTML / CSS
html5 http的轮询和Websocket原理
Oct 19 HTML / CSS
CSS3实现模糊背景的三种效果示例
Mar 30 HTML / CSS
HTML通过表单实现酒店筛选功能
May 18 HTML / CSS
详解CSS中的特指度和层叠问题
Jul 15 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中in_array函数用法探究
2014/11/25 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
7个Javascript地图脚本整理
2009/10/20 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
python通过加号运算符操作列表的方法
2015/07/28 Python
matplotlib中legend位置调整解析
2017/12/19 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
Python实现直播推流效果
2019/11/26 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
database面试题
2013/03/28 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
骨干教师培训方案
2014/05/06 职场文书
应届大学生自荐书
2014/06/17 职场文书
医学专业大学生求职信
2014/07/12 职场文书
幼儿体育课教学反思
2016/02/16 职场文书
《绝招》教学反思
2016/02/20 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python