描述:实现类似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. 最小化安装的centos7.5上编译安装git2.19

    VMware Workstation已经采用最小化安装CentOS7,显示版本为CentOS7.5,准备采用yum安装git. 采用yum list git发现可安装的GIT软件包版本1.8.3.1, ...

  2. Python之旅Day7 面向对象&异常处理

    ########################################面向对象初识######################################### 面向对象简介 面向对象编 ...

  3. EBS API及接口清单

    https://www.cnblogs.com/lizicheng/p/9521742.html 模块 应用场景 类型 API/接口 AP 付款核销 API ap_pay_invoice_pkg.ap ...

  4. Jenkins可用环境变量列表以及环境变量的使用(Shell/Command/Maven/Ant)

    一.可用环境变量列表(以下来自google翻译): BRANCH_NAME 对于多分支项目,这将被设置为正在构建的分支的名称,例如,如果您希望从而master不是从特征分支部署到生产. CHANGE_ ...

  5. 还在使用SimpleDateFormat?

    阅读本文大概需要 3.2 分钟. 前言 日常开发中,我们经常需要使用时间相关类,想必大家对SimpleDateFormat并不陌生.主要是用它进行时间的格式化输出和解析,挺方便快捷的,但是Simple ...

  6. Nginx 在 Linux 上的安装和配置

    一.Nginx的安装 1.单台Nginx的安装 Nginx在Linux上的安装可以参考这篇博客:http://blog.csdn.net/molingduzun123/article/details/ ...

  7. 对称加密AES

    static void Main(string[] args) { //string str = "rqiJI7eEICT+YZmScpAdbjzLnA4mgL3uU5uHXLBeaE6s8 ...

  8. 如何写gdb命令脚本

    作为UNIX/Linux下使用广泛的调试器,gdb不仅提供了丰富的命令,还引入了对脚本的支持:一种是对已存在的脚本语言支持,比如python,用户可以直接书写python脚本,由gdb调用python ...

  9. 一文搞懂 Java 线程中断

    在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...

  10. Redis(3)---Redis事务

    Redis事务 Redis 通过 MULTI .EXEC. DISCARD  和 WATCH 四个命令来实现事务功能. MULTI :标记一个事务块的开始. EXEC: 执行所有事务块内的命令. DI ...