圖片上傳插件ImgUploadJS:用HTML5 File API 實(shí)現(xiàn)截圖粘貼上傳、
一.背景及效果當(dāng)前互聯(lián)網(wǎng)上傳文件最多的就是圖片文件了,但是傳統(tǒng)web圖片的截圖上傳需要:截圖保存-&g;選擇路徑-&g;保存后再點(diǎn)擊上傳-&g;選擇路徑-&g;上傳-&g;插入。圖片文件上傳也需要:選擇路徑再-&g;上傳-&g;插入,步驟繁雜,互聯(lián)......
以下是【金聰采編】分享的內(nèi)容全文:
以下是【金聰采編】分享的內(nèi)容全文:
當(dāng)前互聯(lián)網(wǎng)上傳文件最多的就是圖片文件了,但是傳統(tǒng)web圖片的截圖上傳需要:截圖保存->選擇路徑->保存后再點(diǎn)擊上傳->選擇路徑->上傳->插入。
圖片文件上傳也需要:選擇路徑再->上傳->插入,步驟繁雜,互聯(lián)網(wǎng)體驗(yàn)為王,如果支持截圖粘貼上傳、拖拽上傳將大大提升體驗(yàn)。
當(dāng)前知乎和github對現(xiàn)代瀏覽器均支持這兩種特性,閑來無事就學(xué)習(xí)實(shí)現(xiàn)了一下,今天就說一說這個(gè)1kb插件實(shí)現(xiàn)什么功能,怎么使用和原理。
首先看一下插效果:
截圖后直接粘貼上傳。



二.使用示例
直接調(diào)用:
XML/HTML Code復(fù)制內(nèi)容到剪貼板
- <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
XML/HTML Code復(fù)制內(nèi)容到剪貼板
- <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(未測式,理論應(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異步上傳。
以下是初版本代碼,比較簡單。不再贅述。
部份核心代碼
XML/HTML Code復(fù)制內(nèi)容到剪貼板
- 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對象
- 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);
- }

侵權(quán)舉報(bào)/版權(quán)申訴


