最近在作一个项目,须要实现相似QQ截图后,就是可以在富文本编辑器中粘贴截图并预览。php
先看一下效果:前端
分析一下实现步骤:git
paste
事件localResizeIMG.js
的插件接下来,一步步的来实现:github
paste
事件这个paste
事件的兼容性不是很好,可是能够对用户作友好提示,若是不能使用剪切板事件的话,就在dialog中上传图片也是能够的。web
当QQ截图以后,在富文本编辑器中右键黏贴或者CTRL V就会触发这个事件,这个事件有一个clipboardData
属性,ajax
这里面就是跟paste
有关的数据了。详细知识能够看这一篇博文http://m.jb51.net/show/80657json
我就直接复制粘贴一把梭了,>_>)canvas
function paste(event) { var clipboardData = event.clipboardData; var items, item, types; if (clipboardData) { items = clipboardD a//ta.items; if (!items) { return; } // 保存在剪贴板中的数据类型 types = clipboardData.types || []; for (var i = 0; i < types.length; i++) { if (types[i] === 'Files') { item = items[i]; break; } } // 判断是否为图片数据 if (item && item.kind === 'file' && item.type.match(/^image\//i)) { // 读取该图片 var file = item.getAsFile(), reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function () { var image = reader.result; } } } } //绑定事件 $('#editormd').on('paste', paste);
localResizeIMG.js
的使用这是一个前端压缩的插件,项目地址是https://github.com/think2011/localResizeIMG,
兼容IE10以上,因此还得作个IE版本判断,而后看本身是否须要使用干这个插件,我这里就不写IE的判断了。api
使用方法也很简单,lrz方法接受一个文件路径或者base64的图片,能够设置一个压缩宽度的对象,低于这个宽度的图片不会压缩,大于这个宽度的就会压缩,而后在then
方法中取得压缩后的图片:浏览器
得先引入这个插件,可使用src
引入,也支持amd or cmd模块化
<script src="./dist/lrz.bundle.js"></script>
接着开始使用:
//image就是通过paste事件后获得的图片 lrz(image, {width: 1080}).then(function (res) { var base64 = res.base64; }
七牛云注册好像就送10G的云储存,须要的能够去注册,先下载七牛云sdk,我使用的是php,地址https://developer.qiniu.com/kodo/sdk/php
配置这个上传的文件也很简单。将下载后的压缩包解压,删掉一下没用的文件,而后拖到项目中
uploadImageToQiliu.php:
<?php require_once __DIR__ . '/../autoload.php'; use Qiniu\Auth; // 引入上传类 use Qiniu\Storage\UploadManager; $accessKey = '你的accessKey'; $secretKey = '你的secretKey'; // 初始化签权对象。 $auth = new Auth($accessKey, $secretKey); $bucket = "空间名字"; $upToken = $auth->uploadToken($bucket); // 初始化 UploadManager 对象并进行文件的上传。 $uploadMgr = new UploadManager(); $key = $_POST['name']; $filePath = $_POST['image']; list($ret, $err) = $uploadMgr->putFile($upToken, $key, $filePath); if ($err !== null) { echo json_encode($err); } else { echo json_encode($ret); }
accessKey
和secretKey
注册后就能够看到,bucket
是云储存空间名字,下图的nuc-web-images
接下来是前台传图片和图片名给后台,图片名我就直接用 new Date().getTime()
了
$.ajax({ url: './apis/qiniu-sdk/myApis/uploadImageToQiliu.php', type: 'post', data: { "image": res.base64, "name": new Date().getTime() }, contentType: 'application/x-www-form-urlencoded;charest=UTF-8', success: function (data) { var imageName; try { imageName = JSON.parse(data).key; } catch (e) { alert(e.toString); } var qiniuUrl = ''; testEditor.insertValue(qiniuUrl); } })
testEditor
是我使用的markdown编辑器的对象实例,testEditor.insertValue(qiniuUrl);
就是把格式化好的markdown语句插到光标处。
整个前端代码以下:
function paste(event) { var clipboardData = event.clipboardData; var items, item, types; if (clipboardData) { items = clipboardData.items; if (!items) { return; } // 保存在剪贴板中的数据类型 types = clipboardData.types || []; for (var i = 0; i < types.length; i++) { if (types[i] === 'Files') { item = items[i]; break; } } // 判断是否为图片数据 if (item && item.kind === 'file' && item.type.match(/^image\//i)) { // 读取该图片 var file = item.getAsFile(), reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function () { //前端压缩 lrz(reader.result, {width: 1080}).then(function (res) { $.ajax({ url: './apis/qiniu-sdk/myApis/uploadImageToQiliu.php', type: 'post', data: { "image": res.base64, "name": new Date().getTime() }, contentType: 'application/x-www-form-urlencoded;charest=UTF-8', success: function (data) { var imageName; try { imageName = JSON.parse(data).key; } catch (e) { alert(e.toString); } var qiniuUrl = ''; testEditor.insertValue(qiniuUrl); } }) }); } } } } $('#editormd').on('paste', paste);
另外这个markdown编辑器也是开源的,项目地址是:https://github.com/pandao/editor.md