一 . 背景及效果

当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入。

图片文件上传也需要:选择路径再->上传->插入,步骤繁杂,互联网体验为王,如果支持截图粘贴上传、拖拽上传将大大提升体验。

当前知乎和github对现代浏览器均支持这两种特性,闲来无事就学习实现了一下,今天就说一说这个1kb插件实现什么功能,怎么使用和原理。

首先看一下插效果:

  • 截图后直接粘贴上传。

  • 拖拽上传

http网络

二.使用示例

直接调用:

<div id="box" style="width: 800px; height: 400px; border: 1px solid;" contenteditable="true"></div>
<script type="text/javascript" src="UploadImage.js"></script> new UploadImage("box", "UploadHandler.ashx").upload(function (xhr) {//上传完成后的回调
var img = new Image();
img.src = xhr.responseText;
this.appendChild(img);
});

AMD/CMD

<div id="box" style="width: 800px; height: 400px; border: 1px solid;" contenteditable="true"></div>
<script type="text/javascript" src="require.js"></script>
<script>
require(['UploadImage'], function (UploadImage) { new UploadImage("box", "UploadHandler.ashx").upload(function (xhr) {//上传完成后的回调
var img = new Image();
img.src = xhr.responseText;
this.appendChild(img);
}); })
</script>

三.浏览器支持

当前版本只支持以下,浏览器,后期可能会支持更多浏览器。

  • IE11
  • Chrome
  • FireFox
  • Safari(未测式,理论应该支持)

四.原理及源码

  1. 粘贴上传

    处理目标容器(id)的paste事件,读取e.clipboardData中的数据,如果是图片进行以下处理:

    用H5 File API(FileReader)获取文件的base64代码,并构建FormData异步上传。
  2. 拖拽上传

    处理目标容器(id)的drop事件,读取e.dataTransfer.files(H5 File API: FileList)中的数据,如果是图片并构建FormData异步上传。

以下是初版本代码,比较简单。不再赘述。

部份核心代码

function UploadImage(id, url, key)
{
this.element = document.getElementById(id);
this.url = url; //后端处理图片的路径
this.imgKey = key || "PasteAreaImgKey"; //提到到后端的name }
UploadImage.prototype.paste = function (callback, formData)
{
var thatthat = this;
this.element.addEventListener('paste', function (e) {//处理目标容器(id)的paste事件 if (e.clipboardData && e.clipboardData.items[0].type.indexOf('image') > -1) {
var that = this,
reader = new FileReader();
file = e.clipboardData.items[0].getAsFile();//读取e.clipboardData中的数据:Blob对象 reader.onload = function (e) { //reader读取完成后,xhr上传
var xhr = new XMLHttpRequest(),
fd = formData || (new FormData());;
xhr.open('POST', thatthat.url, true);
xhr.onload = function () {
callback.call(that, xhr);
}
fd.append(thatthat.imgKey, this.result); // this.result得到图片的base64
xhr.send(fd);
}
reader.readAsDataURL(file);//获取base64编码
}
}, false);
}

后端及详细代码请移步:github:https://github.com/etoah/ImgUploadJS

五. 其它功能

部份功能还在开发中,欢迎提建议或意见。

图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传的更多相关文章

  1. 用HTML5 File API 实现截图粘贴上传、拖拽上传

    <!DOCTYPE html><html><head> <title>test chrome paste image</title> < ...

  2. 基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息

    技术栈 jquery 文件上传:jquery.fileupload,github 文档 apk 文件解析:app-info-parser,github 文档 参考:前端解析ipa.apk安装包信息 - ...

  3. HTML5 file API加canvas实现图片前端JS压缩并上传

    一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...

  4. Resumable.js – 基于 HTML5 File API 的文件上传

    Resumable.js 是一个 JavaScript 库,通过 HTML5 文件 API 提供,稳定和可恢复的批量上传功能.在上传大文件的时候通过每个文件分割成小块,每块在上传失败的时候,上传会不断 ...

  5. HTML5——将图片拖拽上传

    如下图所示: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  6. dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

    http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...

  7. DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

    DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库. 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制. 试试看! 将文件拖至此处或点击上传.(这仅仅是 dropzo ...

  8. HTML5应用之文件拖拽上传

    使用HTML5的文件API,可以将操作系统中的文件拖放到浏览器的指定区域,实现文件上传到服务器.本文将结合实例讲解HTML5+jQuery+PHP实现拖拽上传图片的过程,来看下HTML5的魅力吧. H ...

  9. [转]人人网首页拖拽上传详解(HTML5 Drag&Drop、FileReader API、formdata)

    人人网首页拖拽上传详解(HTML5 Drag&Drop.FileReader API.formdata) 2011年12月11日 | 彬Go 上一篇:给力的 Google HTML5 训练营( ...

随机推荐

  1. ASP.NET TextBox 当鼠标点击后清空默认提示文字

    ASP.NET TextBox 当鼠标点击后清空默认提示文字 [ 方法一] 前台代码: <div>    <asp:TextBox ID="txtName" ru ...

  2. qt5.5 qtcreator中文乱码

    MSVC2010默认保存GBK编码.如果不转换成utf-8编码,对GBK编码的文件,中文可以直接用QStringLiteral()宏,如:QMessageBox msgBox;msgBox.setTe ...

  3. JavaScript多文件下载

    对于文件的下载,可以说是一个十分常见的话题,前端的很多项目中都会有这样的需求,比如 highChart 统计图的导出,在线图片编辑中的图片保存,在线代码编辑的代码导出等等.而很多时候,我们只给了一个链 ...

  4. MySQL COLUMNS分区

    200 ? "200px" : this.width)!important;} --> 介绍 COLUMN分区是5.5开始引入的分区功能,只有RANGE COLUMN和LIS ...

  5. [备忘]检索 COM 类工厂中 CLSID 为 {91493441-5A91-11CF-8700-00AA0060263B} 的组件时失败解决方法

    检索 COM 类工厂中 CLSID 为 {91493441-5A91-11CF-8700-00AA0060263B} 的组件时失败,原因是出现以下错误: 80070005 在CSDN上总是有网友问这个 ...

  6. iOS-技巧性总结

    1.AFN与ASI对比 -- AFN1. 基于 NSURLConnection & NSURLSession 进行的封装2. 使用简单3. 提供了自动的序列化 & 反序列化支持! AF ...

  7. 使用 DBCC IND 查看BTree 和 Heap结构

    Table 有两种结构:BTree 和 Heap,一个table的结构必定是其中之一.如果在表上创建clustered index,那么表的结构是BTree:如果表上没有创建Clustered ind ...

  8. SSIS Parameter用法

    今天学习SSISParameter的用法,记录学习的过程. Parameters能够在Project Deployment Model下使用,不能在Package Deployment Model使用 ...

  9. This build of Sublime Text 2 has expired

    使用一直很好的 sublime 2 最近一直提示: This build of Sublime Text 2 has expired, please update to a newer one fro ...

  10. LINQ系列:Linq to Object串联操作符

    串联是一个将两个对象联接在一起的过程.在LINQ中,串联操作将两个集合合并成一个集合,通过Concat操作符实现. Concat 1>. 原型定义 public static IQueryabl ...