圖片上傳插件ImgUploadJS:用HTML5 File API 實(shí)現(xiàn)截圖粘貼上傳、拖拽上傳

當(dāng)前互聯(lián)網(wǎng)上傳文件最多的就是圖片文件了,但是傳統(tǒng)web圖片的截圖上傳需要:截圖保存->選擇路徑->保存后再點(diǎn)擊上傳->選擇路徑->上傳->插入。
圖片文件上傳也需要:選擇路徑再->上傳->插入,步驟繁雜,互聯(lián)網(wǎng)體驗(yàn)為王,如果支持截圖粘貼上傳、拖拽上傳將大大提升體驗(yàn)。
當(dāng)前知乎和github對(duì)現(xiàn)代瀏覽器均支持這兩種特性,閑來(lái)無(wú)事就學(xué)習(xí)實(shí)現(xiàn)了一下,今天就說(shuō)一說(shuō)這個(gè)1kb插件實(shí)現(xiàn)什么功能,怎么使用和原理。
首先看一下插效果:
截圖后直接粘貼上傳。
二.使用示例
直接調(diào)用:
- <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) {//上傳完成后的回調(diào)
- 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) {//上傳完成后的回調(diào)
- var img = new Image();
- img.src = xhr.responseText;
- this.appendChild(img);
- });
- })
- </script>
三.瀏覽器支持
當(dāng)前版本只支持以下,瀏覽器,后期可能會(huì)支持更多瀏覽器。
•IE11
•Chrome
•FireFox
•Safari(未測(cè)式,理論應(yīng)該支持)
四.原理及源碼
1.粘貼上傳
處理目標(biāo)容器(id)的paste事件,讀取e.clipboardData中的數(shù)據(jù),如果是圖片進(jìn)行以下處理:
用H5 File API(FileReader)獲取文件的base64代碼,并構(gòu)建FormData異步上傳。
2.拖拽上傳
處理目標(biāo)容器(id)的drop事件,讀取e.dataTransfer.files(H5 File API: FileList)中的數(shù)據(jù),如果是圖片并構(gòu)建FormData異步上傳。
以下是初版本代碼,比較簡(jiǎn)單。不再贅述。
部份核心代碼
- 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) {//處理目標(biāo)容器(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中的數(shù)據(jù):Blob對(duì)象
- 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);
- }
相關(guān)文章
- vue.js批量上傳文件代碼是一款可實(shí)現(xiàn)刪除,圖片預(yù)覽,文件批量上傳,顯示文件大小等功能,非常不錯(cuò),需要的朋友前來(lái)下載使用吧2020-03-05
html+css+js 實(shí)現(xiàn)拍照預(yù)覽上傳圖片功能
我們?cè)谧鼍W(wǎng)頁(yè)時(shí)經(jīng)常會(huì)需要有上傳圖片的需求,可能是選擇圖片或者拍照上傳。本文記錄了使用css+js實(shí)現(xiàn)圖片選中后的預(yù)覽及壓縮上傳功能,需要的朋友參考下吧2018-01-15- 基于vue.js框架制作圖片上傳組件特效源碼是一款適用于手機(jī)端的圖片上傳代碼,支持批量上傳,拖到圖片上傳,顯示文件數(shù)量和大小等功能。本段代碼可以在各個(gè)網(wǎng)頁(yè)使用,有需要2017-10-17
JS實(shí)現(xiàn)手機(jī)端多圖片上傳刪除特效源碼
JS實(shí)現(xiàn)手機(jī)端多圖片上傳刪除特效源碼,因multiple在安卓手機(jī)中不兼容,所以在安卓上只能一次選中一張圖片,在iOS系統(tǒng)上可以實(shí)現(xiàn)多圖片的上傳。本段代碼可以在各個(gè)網(wǎng)頁(yè)使用2017-02-22使用spring mvc+localResizeIMG實(shí)現(xiàn)HTML5端圖片壓縮上傳的功能
這篇文章主要介紹了使用spring mvc+localResizeIMG實(shí)現(xiàn)HTML5端圖片壓縮上傳的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-16JS實(shí)現(xiàn)的圖片上傳對(duì)比度飽和度調(diào)整特效源碼
JS圖片上傳對(duì)比度飽和度調(diào)整代碼是一款從本地上傳圖片到服務(wù)端,然后通過(guò)濾器算法來(lái)處理圖片,為圖片設(shè)置不同的亮度,對(duì)比度和飽和度,本段代碼適應(yīng)于所有網(wǎng)頁(yè)使用,有需要2016-09-21HTML5結(jié)合zyfile.js插件實(shí)現(xiàn)的多文件圖片預(yù)覽上傳功能特效源碼
是一段實(shí)現(xiàn)了可以選擇本地圖片預(yù)覽并上傳的效果代碼,在預(yù)覽區(qū)的圖片是可以刪除的,同時(shí)將本地圖片拖動(dòng)到網(wǎng)頁(yè)規(guī)定的區(qū)域內(nèi)也是可以自動(dòng)添加到預(yù)覽區(qū)的,此段代碼適用于所有2015-01-29- js上傳選擇圖片功能代碼是一款類似抽獎(jiǎng)程序,上傳預(yù)覽圖片選擇任意一張,可以重置和停止選擇,上傳之后也可以還原,需要的朋友可以來(lái)腳本之家下載2020-06-12