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的@media来编写响应式的页面
Nov 01 HTML / CSS
CSS3实现多背景模拟动态边框的效果
Nov 08 HTML / CSS
html5利用canvas绘画二级树形结构图的示例
Sep 27 HTML / CSS
HTML5的结构和语义(1):前言
Oct 17 HTML / CSS
HTML5引入的新数组TypedArray介绍
Dec 24 HTML / CSS
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
Apr 22 HTML / CSS
html5 input属性使用示例
Jun 28 HTML / CSS
html5中valid、invalid、required的定义
Feb 21 HTML / CSS
浅析移动设备HTML5页面布局
Dec 01 HTML / CSS
html5 datalist 选中option选项后的触发事件
Mar 05 HTML / CSS
recorder.js 基于Html5录音功能的实现
May 26 HTML / CSS
基于CSS制作创意端午节专属加载特效
Jun 01 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
Codeigniter的一些优秀特性总结
2015/01/21 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
bootstrap table实例详解
2017/01/06 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
Vue 设置axios请求格式为form-data的操作步骤
2019/10/29 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
pymongo为mongodb数据库添加索引的方法
2015/05/11 Python
python动态加载包的方法小结
2016/04/18 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
对Python信号处理模块signal详解
2019/01/09 Python
PyQt5实现简易计算器
2020/05/30 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
儿科护士实习自我鉴定
2013/10/17 职场文书
弄虚作假心得体会
2014/09/10 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
七年级作文之下雨天
2019/12/23 职场文书