图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传


Posted in HTML / CSS onJanuary 20, 2016

一 . 背景及效果

当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入。
图片文件上传也需要:选择路径再->上传->插入,步骤繁杂,互联网体验为王,如果支持截图粘贴上传、拖拽上传将大大提升体验。
当前知乎和github对现代浏览器均支持这两种特性,闲来无事就学习实现了一下,今天就说一说这个1kb插件实现什么功能,怎么使用和原理。
首先看一下插效果:
截图后直接粘贴上传。

图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传

拖拽上传

图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传

http网络

图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传


二.使用示例
直接调用:
XML/HTML Code复制内容到剪贴板
  1. <div id="box" style="width: 800px; height: 400px; border: 1px solid;" contenteditable="true"></div>    
  2. <script type="text/javascript" src="UploadImage.js"></script>    
  3. new UploadImage("box", "UploadHandler.ashx").upload(function (xhr) {//上传完成后的回调    
  4. var img = new Image();    
  5. img.src = xhr.responseText;    
  6. this.appendChild(img);    
  7. }); 

AMD/CMD

XML/HTML Code复制内容到剪贴板
  1. <div id="box" style="width: 800px; height: 400px; border: 1px solid;" contenteditable="true"></div>    
  2. <script type="text/javascript" src="require.js"></script>    
  3. <script>    
  4. require(['UploadImage'], function (UploadImage) {    
  5. new UploadImage("box", "UploadHandler.ashx").upload(function (xhr) {//上传完成后的回调    
  6. var img = new Image();    
  7. img.src = xhr.responseText;    
  8. this.appendChild(img);    
  9. });    
  10. })    
  11. </script>   

三.浏览器支持
当前版本只支持以下,浏览器,后期可能会支持更多浏览器。
•IE11
•Chrome
•FireFox
•Safari(未测式,理论应该支持)
四.原理及源码
1.粘贴上传
处理目标容器(id)的paste事件,读取e.clipboardData中的数据,如果是图片进行以下处理:
用H5 File API(FileReader)获取文件的base64代码,并构建FormData异步上传。
2.拖拽上传
处理目标容器(id)的drop事件,读取e.dataTransfer.files(H5 File API: FileList)中的数据,如果是图片并构建FormData异步上传。
以下是初版本代码,比较简单。不再赘述。
部份核心代码

XML/HTML Code复制内容到剪贴板
  1. function UploadImage(id, url, key)    
  2. {    
  3. this.element = document.getElementById(id);    
  4. this.url = url; //后端处理图片的路径    
  5. this.imgKey = key || "PasteAreaImgKey"; //提到到后端的name    
  6. }    
  7. UploadImage.prototype.paste = function (callback, formData)    
  8. {    
  9. var thatthat = this;    
  10. this.element.addEventListener('paste', function (e) {//处理目标容器(id)的paste事件    
  11. if (e.clipboardData && e.clipboardData.items[0].type.indexOf('image') > -1) {    
  12. var that = this,    
  13. reader = new FileReader();    
  14. file = e.clipboardData.items[0].getAsFile();//读取e.clipboardData中的数据:Blob对象    
  15. reader.onload = function (e) { //reader读取完成后,xhr上传    
  16. var xhr = new XMLHttpRequest(),    
  17. fd = formData || (new FormData());;    
  18. xhr.open('POST', thatthat.url, true);    
  19. xhr.onload = function () {    
  20. callback.call(that, xhr);    
  21. }    
  22. fd.append(thatthat.imgKey, this.result); // this.result得到图片的base64    
  23. xhr.send(fd);    
  24. }    
  25. reader.readAsDataURL(file);//获取base64编码    
  26. }    
  27. }, false);    
  28. }  
HTML / CSS 相关文章推荐
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
Jul 21 HTML / CSS
布局和排版教程 纯css3实现图片三角形排列
Oct 17 HTML / CSS
利用css3径向渐变做一张优惠券的示例
Mar 22 HTML / CSS
html5标记文字_动力节点Java学院整理
Jul 11 HTML / CSS
详解Canvas事件绑定
Jun 27 HTML / CSS
html5指南-5.使用web storage存储键值对的数据
Jan 07 HTML / CSS
HTML5使用drawImage()方法绘制图像
Jun 23 HTML / CSS
基于html5 DeviceOrientation 实现微信摇一摇功能
Sep 25 HTML / CSS
HTML5触摸事件演化tap事件介绍
Mar 25 HTML / CSS
HTML5新增加的功能详解
Sep 05 HTML / CSS
详解html5 postMessage解决跨域通信的问题
Aug 17 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
Dec 02 HTML / CSS
HTML5 History API 实现无刷新跳转
Jan 11 #HTML / CSS
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
Jan 11 #HTML / CSS
Html5插件教程之添加浏览器放大镜效果的商品橱窗
Jan 07 #HTML / CSS
移动端html5 meta标签的神奇功效
Jan 06 #HTML / CSS
Web时代变迁及html5与html4的区别
Jan 06 #HTML / CSS
HTML5学习笔记之html5与传统html区别
Jan 06 #HTML / CSS
探讨HTML5移动开发的几大特性(必看)
Dec 30 #HTML / CSS
You might like
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
网站上面有这种切换效果
2006/06/26 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
python使用marshal模块序列化实例
2014/09/25 Python
Python迭代器和生成器介绍
2015/03/06 Python
scrapy爬虫完整实例
2018/01/25 Python
Python读取stdin方法实例
2019/05/24 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
python——全排列数的生成方式
2020/02/26 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
简单了解如何封装自己的Python包
2020/07/08 Python
Python实现手绘图效果实例分享
2020/07/22 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
某个公司的Java笔面试题
2016/03/11 面试题
优秀学生干部个人的自我评价
2013/10/04 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书