js实现ctrl+v上传图片
描述:实现类似QQ截图删上传图片的功能
a、需要的js插件
paste.image.js
地址:https://github.com/iyangyuan/pasteimg
b、paste.image.js
(function($,exports){
$.fn.extend({
pasteImage: function(callback){
var util = {
/*
* @function:
* 从指定类继承,并且带简单数据构造器
* @params:
* parent 0个构造参数的父类,默认Object
* @return:
* 子类,可以访问父类的prototype属性
*/
extend: function(parent){
/*
* @example:
* if the param construct={name: "nadel"};
* then the function construct will like:
* function(name){
* this.name = name;
* }
*/
parent = parent || Object;
var fn = function(construct){
var attribute = "";
for(attribute in construct){
if(Object.prototype.hasOwnProperty.call(construct, attribute)){
this[attribute] = construct[attribute];
}
}
};
fn.prototype = new parent();
strategys.push(fn);
return fn;
},
/*
* @function:
* 遍历数组中的object,根据正则匹配指定属性
* @params:
* array object数组
* property object属性
* regex object属性值正则表达式
* @return:
* 匹配到的object数组
*/
getProperty: function(array, property, regex){
var result = [],
i = 0;
for(i = 0; i<array.length; i++){
if(regex.test(array[i][property])){
result.push(array[i]);
}
}
return result;
},
/*
* @function:
* 将image document对象转换为DataUrl
* @params:
* element: image document对象,可以用document.getElementById获取
* type: 生成的图片类型,例如:image/png,默认为image/png
* @return:
* DataUrl
*/
imageToDataUrl: function(element, type){
type = type || "image/png";
try{
//利用canvas获取图片的DataUrl,但受跨域限制
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
result = "";
canvas.width = element.width;
canvas.height = element.height;
ctx.drawImage(element, 0, 0);
result = canvas.toDataURL(type);
if(result === "data:,"){
result = "";
}
return result;
}catch(e){
//目标服务器不允许跨域访问资源
return "";
}
},
/*
* @functions:
* 将一个类数组中的数据push到真正的数组中
* @params:
* array 数组
* arrayLike 类数组
*/
arrayLikePush: function(array, arrayLike){
var i = 0;
for(i = 0;i<arrayLike.length;i++){
array.push(arrayLike[i]);
}
}
},
strategys = [],
strategy = {},
i = 0;
//算法类(接口)
var Strategy = function(){};
Strategy.prototype.exec = function(){
//意在必须重写
throw new Error("The method 'chrome' must be override!");
};
Strategy.prototype.isSuport = function(){
throw new Error("The method 'chrome' must be override!");
};
//谷歌浏览器算法
var Chrome = util.extend(Strategy);
Chrome.prototype.exec = function(){
var that = this;
that.$element.on("paste",function(event){
var items = (event.clipboardData || event.originalEvent.clipboardData).items,
//取出html对象
htmlBlobs = util.getProperty(items, "type", /^text\/html$/im),
imgElements = [],
loadedCount = 0,
htmlImages = [],
htmlResults = [],
reader = {},
parseFinish = function(){
var $html = {},
$imageLoadDiv = {};
if(htmlResults.length === htmlBlobs.length){
//解析html中的图片
for(k = 0;k<htmlResults.length;k++){
$html = htmlResults[k].replace(/\n|\r|\n\r/g, "");
$html = $html.replace("<html><body>", "<div>");
$html = $html.replace("</body></html>", "</div>");
$html = $($html);
util.arrayLikePush(imgElements, $html.find("img"));
}
//图片预加载
$("body").append(imageLoadDiv);
$imageLoadDiv = $("#paste_image_load");
for(k = 0; k<imgElements.length; k++){
imgElements[k].onload = imgOnload;
$imageLoadDiv.append(imgElements[k]);
}
}
},
loadFinish = function(){
var dataurl = "",
k = 0;
if(imgElements.length === loadedCount){
//尝试将图像dom转换成dataurl,如果失败,返回img src
for(k = 0;k<imgElements.length;k++){
dataurl = "";
dataurl = util.imageToDataUrl(imgElements[k]);
if(dataurl){
htmlImages.push(dataurl);
}else{
htmlImages.push(imgElements[k].getAttribute("src"));
}
}
$("#paste_image_load").remove();
//返回结果
that.callback(htmlImages);
}
},
imgOnload = function(){
loadedCount = loadedCount+1;
loadFinish();
},
imageLoadDiv = "<div id='paste_image_load' style='height: 0;width: 0;display: none;'></div>",
i = 0;
//提取html对象中的图片
for(i = 0;i<htmlBlobs.length;i++){
htmlBlobs[i].getAsString(function(html){
htmlResults.push(html);
parseFinish();
});
}
});
};
Chrome.prototype.isSuport = function(){
return window.navigator.userAgent.toLowerCase().indexOf("chrome")>-1;
};
//火狐浏览器和IE11浏览器算法
var FirefoxAndIE11 = util.extend(Strategy);
FirefoxAndIE11.prototype.exec = function(){
var that = this,
clipboardDiv = "<div id='paste_content_catch' contentEditable='true' style='position: fixed;left: -9999px;top: -9999px; opacity: 0;'></div>",
$clipboardDiv = {},
i = 0;
//初始化clipboard catch
$("body").append(clipboardDiv);
$clipboardDiv = $("#paste_content_catch");
//监听ctrl+v事件
that.$element.on("keydown",function(event){
if(event.ctrlKey == 1 && event.keyCode == 86){
$clipboardDiv.html("");
$clipboardDiv.focus();
//模拟多线程
setTimeout(function(){
var id = "paste_image_load_" + new Date().getTime(),
imageLoadDiv = "<div id='"+id+"' style='height: 0;width: 0;display: none;'></div>",
$imageLoadDiv = {},
imageElements = [],
images = [],
loadedCount = 0;
//获取剪切板中的img元素
imageElements = $clipboardDiv.find("img");
//图片预加载
$("body").append(imageLoadDiv);
$imageLoadDiv = $("#"+id);
for(i = 0;i<imageElements.length;i++){
imageElements[i].onload = function(){
var dataurl = "",
k = 0;
loadedCount = loadedCount+1;
if(imageElements.length === loadedCount){
//尝试将图像dom转换成dataurl,如果失败,返回img src
for(k = 0;k<imageElements.length;k++){
dataurl = "";
dataurl = util.imageToDataUrl(imageElements[k]);
if(dataurl){
images.push(dataurl);
}else{
images.push(imageElements[k].getAttribute("src"));
}
}
$imageLoadDiv.remove();
//返回结果
that.callback(images);
}
};
$imageLoadDiv.append(imageElements[i]);
}
imageElements = $imageLoadDiv.find("img");
$clipboardDiv.html("");
that.$element.focus();
},0);
}
});
};
FirefoxAndIE11.prototype.isSuport = function(){
var result = false;
try{
result = window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1 ||
(Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject);
}catch(e){}
return result;
};
//选择策略
for(i = 0;i<strategys.length;i++){
strategy = new strategys[i]({
$element: $(this),
callback: callback
});
if(strategy.isSuport()){
strategy.exec();
break;
}
}
}
});
})(jQuery,this);
c、demo.html
<body>
<input type="text" id="container" placeholder="在这粘贴图片"/>
<script>
$("#container").pasteImage(function(imgs){
$.each(imgs,function(i,n){
var imageData= n.replace("data:image/png;base64,", "");
var imageUrl=""
$.ajax({
type: "POST",
url: path+"/tmsSellMsg/uploadImageByBase64Code",
data: {"imageData":imageData},
dataType: "json",
async:false,
success: function(data){
imageUrl = data;
}
});
$("body").append("<img src='"+imageUrl+"' >");
});
});
</script>
</body>
d、springmvc
@RequestMapping(value = "/uploadImageByBase64Code", method = RequestMethod.POST)
public @ResponseBody String insertTmsSellMsgByExcel2(String imageData) throws Exception {
byte[] buf = Base64Utils.decodeFromString(imageData);
InputStream sbs = new ByteArrayInputStream(buf);
String imageUrl= OSSUtils.putObject(sbs);
return JsonUtils.objectToJson(imageUrl);
}
致此结束……

关注我的公众号,精彩内容不能错过
js实现ctrl+v上传图片的更多相关文章
- js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)【转载】
我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=> ...
- js实现ctrl+v粘贴上传图片(兼容chrome,firefox,ie11)
背景 我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=& ...
- js实现ctrl+v粘贴图片或是截图
浏览器环境:谷歌浏览器 1.ctrl+v粘贴图片都是监听paste时间实现的,复制的数据都存在clipboardData下面,虽然打印显示数据长度为0,但是还是可以获取数据的 2.打印clipboar ...
- js实现ctrl+v粘贴并上传图片
前端页面: <textarea class="scroll" id="text" placeholder="在此输入...">& ...
- 我为什么要拒绝Ctrl+C和Ctrl+V?
工作中避免不了会去参考别人的思路和实现(代码),因此浏览博文和相关网站成了日常活动.在这一过程中,James看到很多博文都是满篇的代码,而没有相应的分析(文字描述或者流程图). 对于上述这种情况,Ja ...
- C# 控制台程序实现 Ctrl + V 粘贴功能
代码主要分为两部分,首先调用系统API注册剪切板相关的事件,然后监控用户的按键操作.完整代码如下: class ClipBoard { [DllImport("user32.dll" ...
- c# TextBox只允许输入数字,禁用右键粘贴,允许Ctrl+v粘贴数字
TextBox只允许输入数字,最大长度为10 //TextBox.ShortcutsEnabled为false 禁止右键和Ctrl+v private void txtNumber_KeyPress( ...
- 一个Ctrl+V下的问题
对于电脑快捷键来说恐怕没什么比Ctrl+C和Ctrl+V更熟悉的了. 最近做了一个小程序,界面上有一个文本框,要做的事情就是把从别的地方复制内容后粘贴到文本框中,然后以自己处理后的格式显示出来. 为了 ...
- word2010 ctrl v not work
终于解决了word 2010中ctrl v 不能用的问题. 0 word ctrl c 可以用,右键粘贴可以正常使用,快捷键ctrl v不能用. 1 在excel中ctrl c 和ctrl v,可以正 ...
随机推荐
- stm32模拟IO读写AT24C02
/* *@brief 主机向从机写多字节 * *@param addr - 地址 *@param p_buf - 数据指针 *@param len - 待写入字节长度 * *@return * *@n ...
- 深入Java集合学习系列:LinkedHashMap的实现原理
参考下面链接: http://zhangshixi.iteye.com/blog/673789
- Ubuntu允许root远程登录配置
1.背景 近期在本地的虚拟机VMware上安装了Ubuntu Server 17.04,由于系统是无界面的,所有操作都需要通过Linux命令进行操作.后来不想直接在服务器上操作,想通过远程工具Xshe ...
- Spring5中的DispatcherServlet初始化
Spring MVC像许多其它Web框架,被设计围绕前端控制器(DispatcherServlet)实际的工作是由可配置的,委托组件执行提供了一种用于请求处理的共享算法.这个模型是灵活的,支持不同的工 ...
- 《转》studio界面、快捷键
按键 说明 F1 帮助 Alt(Option)+F1 查找文件所在目录位置 Alt(Option)+1 快速打开或隐藏工程面板 Ctrl(Command)+Alt(Option)+ 打开设置对话框 A ...
- Java核心技术卷一基础知识-第12章-泛型程序设计-读书笔记
第12章 泛型程序设计 本章内容: * 为什么要使用泛型程序设计 * 定义简单泛型类 * 泛型方法 * 类型变量的限定 * 泛型代码和虚拟机 * 约束与局限性 * 泛型类型的继承规则 * 通配符类型 ...
- table-layout引起的探索——fixed和auto的区别
问题:最近想把mui提供的底部导航组件样式单独抽出来,遇到一个问题:给底部图片下的文字设置了超出隐藏,但没有生效,如下图: 注:该底部导航为mui提供的组件 解决:这让我百思不得其解,经过一些琢磨后发 ...
- ruby-attr_accessor使用
ruby语法-attr_accessor方法使用 本文主要讲解下ruby下attr_accessor方法的使用. 示例1: class Person end person = Person.new p ...
- 《Java 多线程编程核心技术》- 笔记
作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...
- spring boot整合 springmvc+mybatis
需要以下依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId&g ...