描述:实现类似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上传图片的更多相关文章

  1. js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)【转载】

    我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=> ...

  2. js实现ctrl+v粘贴上传图片(兼容chrome,firefox,ie11)

    背景 我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=& ...

  3. js实现ctrl+v粘贴图片或是截图

    浏览器环境:谷歌浏览器 1.ctrl+v粘贴图片都是监听paste时间实现的,复制的数据都存在clipboardData下面,虽然打印显示数据长度为0,但是还是可以获取数据的 2.打印clipboar ...

  4. js实现ctrl+v粘贴并上传图片

    前端页面: <textarea class="scroll" id="text" placeholder="在此输入...">& ...

  5. 我为什么要拒绝Ctrl+C和Ctrl+V?

    工作中避免不了会去参考别人的思路和实现(代码),因此浏览博文和相关网站成了日常活动.在这一过程中,James看到很多博文都是满篇的代码,而没有相应的分析(文字描述或者流程图). 对于上述这种情况,Ja ...

  6. C# 控制台程序实现 Ctrl + V 粘贴功能

    代码主要分为两部分,首先调用系统API注册剪切板相关的事件,然后监控用户的按键操作.完整代码如下: class ClipBoard { [DllImport("user32.dll" ...

  7. c# TextBox只允许输入数字,禁用右键粘贴,允许Ctrl+v粘贴数字

    TextBox只允许输入数字,最大长度为10 //TextBox.ShortcutsEnabled为false 禁止右键和Ctrl+v private void txtNumber_KeyPress( ...

  8. 一个Ctrl+V下的问题

    对于电脑快捷键来说恐怕没什么比Ctrl+C和Ctrl+V更熟悉的了. 最近做了一个小程序,界面上有一个文本框,要做的事情就是把从别的地方复制内容后粘贴到文本框中,然后以自己处理后的格式显示出来. 为了 ...

  9. word2010 ctrl v not work

    终于解决了word 2010中ctrl v 不能用的问题. 0 word ctrl c 可以用,右键粘贴可以正常使用,快捷键ctrl v不能用. 1 在excel中ctrl c 和ctrl v,可以正 ...

随机推荐

  1. Virtio: An I/O virtualization framework for Linux

    The Linux kernel supports a variety of virtualization schemes, and that's likely to grow as virtuali ...

  2. C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)

    前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ...

  3. 【红色警报】XXE 高危漏洞将大面积影响微信支付安全,可能导致系统沦陷,请升级你的系统!

    今天,微信支付发布了一则紧急通知: 尊敬的微信支付商户: 您的系统在接受微信支付XML格式的商户回调通知(支付成功通知.退款成功通知.委托代扣签约/解约/扣款通知.车主解约通知)时,如未正确地进行安全 ...

  4. C#通过COM组件操作IE浏览器(二):使用IHTMLDocument3完成登录

    第一章介绍了如何打开网站,这一章介绍一下使用IHTMLDocument3完成登录博客园,以下为代码: SHDocVw.InternetExplorer oBrowser = new SHDocVw.I ...

  5. 基于TensorFlow的深度学习系列教程 2——常量Constant

    前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hell ...

  6. Android JNI 学习(六):Object Operations Api

    一.AllocObject jobjectAllocObject(JNIEnv *env, jclass clazz); 分配新 Java 对象而不调用该对象的任何构造函数.返回该对象的引用. cla ...

  7. Oneinstack 环境安装 Flarum 轻量级论坛程序

    之前做了个论坛,使用的是discuz框架,虽然这个框架已经很成熟,功能也相对较多,但毕竟老框架了,今天尝试用Flarum来搭建一个论坛,Flarum相对来说美观而且速度快 系统环境使用oneinsta ...

  8. Java工程师必备

    Java工程师必备 JAVA基础扎实,熟悉JVM,熟悉网络.多线程.分布式编程及性能调优 精通Java EE相关技术 熟练运用Spring/SpringBoot/MyBatis等基础框架 熟悉分布式系 ...

  9. 微信小程序快捷键(Mac和windows)

    最近因为有点闲暇时间,所以抽空简单了解了小程序,因为小程序是使用微信开发者工具编码,不能使用其它编辑器,比如,Sublime,Hubilder等. 所以就百度了一下小程序快捷键,但总觉得不全,所以就去 ...

  10. Oracle sql共享池$sqlarea分析SQL资源使用情况

    遇到需要排查一个系统使用sql的情况,可以通过查询Oracle的$sql.$ssssion.$sqlarea进行统计排查 排查时可以先看一下$sql和$session的基本信息 select * fr ...