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 相关文章推荐
定义css设备类型-Media Queries图表简介及使用方法
Jan 21 HTML / CSS
使用CSS3创建动态菜单效果
Jul 10 HTML / CSS
基于ccs3的timeline时间线实现方法
Apr 30 HTML / CSS
HTML5应用之文件上传
Dec 30 HTML / CSS
html5中valid、invalid、required的定义
Feb 21 HTML / CSS
HTML5调用手机摄像头拍照的实现思路及代码
Jun 15 HTML / CSS
2014年圣诞节倒计时网页的制作过程
Dec 05 HTML / CSS
html5组织内容_动力节点Java学院整理
Jul 10 HTML / CSS
html5 canvas简单封装一个echarts实现不了的饼图
Jun 12 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
Sep 19 HTML / CSS
h5网页水印SDK的实现代码示例
Feb 19 HTML / CSS
CSS作用域(样式分割)的使用汇总
Nov 07 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
mayfish 数据入库验证代码
2010/04/30 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php发送与接收流文件的方法
2015/02/11 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
计算机专业优秀大学生自我总结
2014/01/21 职场文书
分公司经理任命书
2014/06/05 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
windows系统搭建WEB服务器详细教程
2022/08/05 Servers