从剪切板粘贴图片上传
来源:互联网 发布:dnf韩服账号淘宝 编辑:程序博客网 时间:2024/05/01 04:40
一个需求:让用户使用剪切板来粘贴图片(而不是将图片保存到本地,然后再选取文件上传)
fakepath是什么鬼
今天做图片上传时发现,不论是什么路径上传的文件,路径都变成了这种格式 “C:\fakepath\文件名”。
以前做图片上传时没留意过这个fakepath,直译过来是伪路径,网上搜了一下 说是浏览器为了保护用户的文件安全,隐藏了上传的真实路径,用fakepath代替,或者调整浏览器的相关安全设置可以解决这个问题。
从剪切板获取图片信息
首先要明确两点:
- 剪切板里可以装1个或者多个数据项
- 粘贴剪切板里的截图 跟 粘贴一个图片文件 不一样。例如:右键复制一个图片得到的是一个图片文件
我们这里讨论的是前者——剪切板里的截图,暂不考虑后者。从剪切板粘贴图片的教程很多,这里总结一下,大致分为4步:
- 拦截元素的paste事件
找到event数据中的我们需要的图片信息
e.clipboardData.items[0].type.indexOf('image') > -1
拿到图片的dataURL
var reader = new FileReader(), file = e.clipboardData.items[0].getAsFile();reader.onload = function(e){ //this.result 可以得到图片的base64}reader.readAsDataURL(file);
readAsDataURL : The readAsDataURL method is used to read the contents of the specified Blob or File. When the read operation is finished, the readyState becomes DONE, and the loadend is triggered. At that time, the result attribute contains the data as a URL representing the file’s data as a base64 encoded string.
readAsDataURL 方法用来读Blob或File内容,当读操作完成之后,readyState 状态变成DONE,并触发 loadend 方法。此时,result 属性就包含了一个URL字符串,即文件数据的base64编码格式。
使用FormData上传
var formData = new FormData(); formData.append('file', file , filename); //第三个是文件名
注意:在Chrome中能够直接通过clipboardData获取截图的图片数据,在火狐等浏览器中无法直接获取图片数据,所以可以在粘贴的时候hack一下,ff里编辑[contenteditable]时,粘贴一个图片,ff会把图片当作图文混排的插图将它转化为一个
<img/>
元素插进去,img的src属性就是base64的dataURL
参考资料及扩展:
从剪切版里粘贴图片: HTML5 Clipboard API hacking
Blob 对象类型
read data ( text / image ) from clipboard in different browsers
FileAPI
Local I/O tests 除了 Clipboard API,这里还包括 Drag&Drop、FileReader、FileSaving、CopyAPI(“点击我拷贝到剪切板”这样的功能)的原生JavaScript实现demo。
Canvas => Base64 => Binary String
HTML5文件实现拖拽上传
理解DOMString、Document、FormData、Blob、File、ArrayBuffer数据类型
DataURL与File,Blob,canvas对象之间的互相转换
keyup、keypress和keydown事件 详解
XMLHttpRequest对象
base64编码上传问题
base64转Blob
function base64ToBlob(base64Str){ var dataURI = base64Str; var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // mime类型 var byteString = atob(dataURI.split(',')[1]); //base64 解码 var arrayBuffer = new ArrayBuffer(byteString.length); //创建缓冲数组 var intArray = new Uint8Array(arrayBuffer); //创建视图 for (i = 0; i < byteString.length; i += 1) { intArray[i] = byteString.charCodeAt(i); } return intArray//new Blob([intArray], { type: mimeString}); //转成blob}
- 从剪切板粘贴图片上传
- 从剪贴板粘贴图片
- 自动上传本地图片和word图片(word图片需使用从word粘贴功能)
- “是否允许从您的剪切板上粘贴信息”解决方法
- 图片的粘贴上传组件
- java实现粘贴图片上传
- 从剪贴板粘贴图片2
- 复制 粘贴 剪切板
- Vim 复制粘贴剪切板
- FCK Editor 从Word文档粘贴的多个图片上传到服务器
- 将剪切板中的图片粘贴至Word,浮动于文字上方,设置图片背景透明
- ckeditor粘贴的图片自动上传
- 剪切板的使用: 复制 粘贴
- Java 访问(复制,粘贴)剪切板
- Java 访问(复制,粘贴)剪切板
- UIPasteboard (粘贴板、剪切板使用)
- Java 访问(复制,粘贴)剪切板
- 从浏览器剪切板中读取图片并显示--for chrome
- 配置tomcat manager【Tomcat Manager用户配置详解】【Tomcat的Manager显示403 Access Denied】
- 【机器学习-斯坦福】因子分析(Factor Analysis)
- 从NSTimer的失效性谈起(二):关于GCD Timer和libdispatch
- LintCode 197. 排列序号
- 每天一个linux命令(41):ps命令
- 从剪切板粘贴图片上传
- 重写和重载
- HDU 3555 Bomb
- jQuery1.6.1 源码解读
- CentOS linux 中mysql5.6 占用内存过大处理
- 数据预处理 - 归一化/标准化/正则化
- YTU 2392: 求各位数字之和
- Hibernate一级缓存详解
- Application类