截图后粘贴或拖拽上传
在浏览器中使用截图工具截图后直接粘贴到页面上传,以及拖拽到页面标签区域上传
主要使用了粘贴(paste)事件,以及拖拽(drag)事件,其中拖拽时要禁用浏览器的默认将图片打开的行为
例子:
HTML部分:
<div>截图后粘贴或拖拽到下框:<div id="upload" style="width: 800px; height: 600px; border: 1px solid red;"></div></div>
js部分:
1 <script> 2 (function (mod) { 3 if (typeof exports == "object" && typeof module == "object") // CommonJS 4 module.exports = mod(); 5 else if (typeof define == "function" && define.amd) // AMD 6 return define([], mod); 7 else // Plain browser env 8 window.UploadImage = mod(); 9 })(function () { 10 11 12 function UploadImage(id, url, key) { 13 this.element = document.getElementById(id); 14 this.url = url; //后端处理图片的路径 15 this.imgKey = key || "AreaImgKey"; //提到到后端的name 16 17 } 18 //粘贴图片事件 19 UploadImage.prototype.paste = function (callback, formData) { 20 var thatthat = this; 21 this.element.addEventListener('paste', function (e) {//处理目标容器(id)的paste事件 22 23 if (e.clipboardData && e.clipboardData.items.length > 0 && e.clipboardData.items[0].type.indexOf('image') > -1) { 24 var that = this, 25 file = e.clipboardData.items[0].getAsFile();//读取e.clipboardData中的数据 26 27 dataReader(file, function (e) { //reader读取完成后,xhr上传 28 var fd = formData || (new FormData()); 29 fd.append(thatthat.imgKey, this.result); // this.result得到图片的base64 30 31 xhRequest('POST', thatthat.url, fd, callback, that); 32 33 }); 34 35 } 36 }, false); 37 38 }; 39 40 //拖拽事件 41 UploadImage.prototype.drag = function (callback, formData) { 42 var that = this; 43 this.element.addEventListener('drop', function (e) {//处理目标容器(id)的drop事件 44 e.preventDefault(); //取消默认浏览器拖拽效果 45 var fileList = e.dataTransfer.files; //获取文件对象 46 //检测是否是拖拽文件到页面的操作 47 if (fileList.length == 0) { 48 return false; 49 } 50 //检测文件是不是图片 51 if (fileList[0].type.indexOf('image') === -1) { 52 console.log && console.log("您拖的不是图片!"); 53 return false; 54 } 55 var fd = formData || (new FormData()); 56 fd.append(that.imgKey, fileList[0]); // 57 xhRequest('POST', that.url, fd, callback, this); 58 59 }, false); 60 }; 61 62 //上传 63 UploadImage.prototype.upload = function (callback, formData) { 64 this.drag(callback, formData); 65 this.paste(callback, formData); 66 }; 67 68 preventDragDefault(); 69 //private 70 71 function xhRequest(method, url, formData, callback, callbackContext) { 72 var xhr = new XMLHttpRequest(); 73 xhr.open(method, url, true); 74 xhr.onload = function () { 75 callback && callback.call(callbackContext || this, xhr); 76 }; 77 xhr.send(formData || (new FormData())); 78 79 } 80 81 function preventDragDefault()//阻止浏览器默认将图片打开的行为 82 { 83 document.addEventListener("dragleave", preventDefault);//拖离 84 document.addEventListener("drop", preventDefault);//拖后放 85 document.addEventListener("dragenter", preventDefault);//拖进 86 document.addEventListener("dragover", preventDefault);//拖来拖去 87 } 88 89 function preventDefault(e) { 90 e.preventDefault(); 91 } 92 93 function dataReader(file, callback) { 94 var reader = new FileReader(); 95 reader.onload = callback; 96 reader.readAsDataURL(file);//获取base64编码 97 } 98 return UploadImage; 99 }); 100 101 </script>
调用:
<script>new UploadImage("upload", "UploadImage").upload(function (xhr) {var img = new Image();img.src = xhr.responseText;this.appendChild(img);});</script>
后端保存图片部分代码:
[HttpPost]public ActionResult UploadImage(){if (!System.IO.Directory.Exists(Server.MapPath("upload"))){System.IO.Directory.CreateDirectory(Server.MapPath("upload"));}if (Request.Files.Count == 0){string strData = Request["AreaImgKey"].ToString(); //粘贴上传,取的base64编码Bitmap img = Base64StringToImage(strData);string imgName = "/" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";if (img != null){img.Save(Server.MapPath("upload") + imgName, System.Drawing.Imaging.ImageFormat.Jpeg);return Content("upload" + imgName);}}else //拖拽上传可直接拿到文件 {string imgName = "/" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + Request.Files[0].FileName;Request.Files[0].SaveAs(Server.MapPath("upload") + imgName);return Content("upload" + imgName);}return Content("");}protected Bitmap Base64StringToImage(string strbase64){try{byte[] arr = Convert.FromBase64String(strbase64.Split(',')[1]);MemoryStream ms = new MemoryStream(arr);Bitmap bmp = new Bitmap(ms);ms.Close();return bmp;}catch (Exception ex){return null;}}
demo源码下载地址:链接:https://pan.baidu.com/s/1bMdl5saJruVy0d4DcFj6Bg 密码:iqui
截图后粘贴或拖拽上传相关推荐
- js 监听 复制图片 拖拽上传文件 并填充到markdown编辑器
文章目录 效果 获取粘贴的文件 获取拖拽的文件 发送请求 生成markdown 语句 实现逻辑代码(主要实现) 后端代码 效果 获取粘贴的文件 const { clipboardData } = e; ...
- vue+element-ui实现富文本(含有图片粘贴拖拽上传)
vue+element-ui实现富文本(含有图片粘贴拖拽上传) Just For Share | 仅仅分享 首先需要安装 cnpm i vue-quill-editor -D 富文本编辑器 cnpm ...
- html5 上传超大文件,HTML5教程 如何拖拽上传大文件
本篇教程探讨了HTML5教程 如何拖拽上传大文件,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < 前言: 大文件传输一直是技术上的一大难点.文件过大时,一些性 ...
- [开源应用]利用HTTPHandler+resumableJs+HTML5实现拖拽上传[大]文件
前言: 大文件传输一直是技术上的一大难点.文件过大时,一些性提交所有的内容进内存是不现实的.大文件带来问题还有是否支持断点传输和多文件同时传输. 本文以resumableJs为例,介绍了如何在ASP. ...
- 实现拖拽上传文件的一款小控件——dropzone
由于专注所以专业.非常多小巧的东西乍一看非常不起眼,却在特定的领域表现不俗,就是由于集中了热情. dropzone就是这样一款小控件,实现拖拽上传.它不依赖于其他像jquery等JS库.并且支持多方面 ...
- dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库....
http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...
- 拖拽上传技术-----html5[转载]
原网址:http://blog.163.com/mongying_net/blog/static/35112712012345352226/ 拖拽上传应用主要使用了以下HTML5技术: Drag&am ...
- Nodejs express、html5实现拖拽上传(转载)
一.前言 文件上传是一 个比较常见的功能,传统的选择方式的上传比较麻烦,需要先点击上传按钮,然后再找到文件的路径,然后上传.给用户体验带来很大问题.html5开始支持拖 拽上传的需要的api.node ...
- js使用input上传文件夹、拖拽上传文件夹并将文件夹结构展示为树形结构
一.实现效果 左侧区域支持选择一个系统中的文件夹,或者将文件夹拖拽到这个区域进行上传,右侧区域可以将文件夹的结构展示为树形结构. 二.代码实现 由于需要使用树形插件zTree,这个插件是依赖于jque ...
最新文章
- 链表划分为左小、中相等、右大
- 算法学习笔记2022.1.8
- python实例化对象做实参_如何在Python中记住类实例化?
- CVPR 2019 Oral | 华科开源效果超群的人体姿态迁移算法
- GitHub 报告:中国755万开发者排全球第二
- linux回收内存的方法,linux释放内存的方法
- JavaFX桌面应用开发-Button(按钮)与事件
- 顶级 Java 源码教程项目大汇总
- js日期格式化的两种方法
- 程序员高效率办公软件(推荐)。
- python模拟登陆微博_超详细的Python实现微博模拟登陆,小白都能懂
- 同态加密之Paillier算法
- word固定上方菜单栏
- 新版曝光骗子公示PHP系统源码+云黑系统
- ARP病毒的分析与防治
- rsyncd.conf 文件man手册翻译
- 扬名立万影评爬取与分析
- 树莓派/linux/Ubuntu取消鼠标指针光标,类似于平板模式。实测有效。
- python数学建模基础教程_Python 3破冰人工智能 从入门到实战 大学生数学建模竞赛数学建模算法与应用教程 机器学习深度学...
- 上海市考 计算机类岗位,2020上海公务员考试职位表解读:本科学历仍占主体
热门文章
- 计算机安全知识课堂导入设计,“计算机安全与防护教学设计”教学设计.doc
- html5 背景拼贴,AI创建漂亮的无缝拼贴图案背景样式
- flash activex java_Adobe flash player ActiveX和NPAPI和PPAPI 这三个软件有什么区别?
- tomcat 项目发布失败原因_项目启动tomcat失败的几种可能原因和解决方法
- html5 子标题栏,HTML5 建构主义标题栏页面模板
- python常用运维模块_python常用模块之一
- 数据交换平台_从零开始理解大数据架构之数据交换平台
- python16进制转2进制流_将十六进制文件转换为二进制文件
- mysql select内部原理_数据库SQL SELECT查询的工作原理
- 南昌理工学院的计算机科学与技术专业怎么样,南昌理工学院有哪些专业及什么专业好...