1. 程式人生 > 程式設計 >Js實現貼上上傳圖片的原理及示例

Js實現貼上上傳圖片的原理及示例

我們或多或少都使用過各式各樣的富文字編輯器,其中有一個很方便功能,複製一張圖片然後貼上進文字框,這張圖片就被上傳了,那麼這個方便的功能是如何實現的呢?

原理分析:
複製=>貼上=>上傳

在這個操作過程中,我們需要做的就是:監聽貼上事件=>獲取剪貼簿裡的內容=>發請求上傳

需要明白的是:

我們只能上傳截圖工具截的圖片(qq截圖、微信截圖等),不能貼上上傳系統裡的圖片(從桌面上、硬盤裡複製),因為他們是存在完全不同的地方。

知悉paste event這個事件:當進行貼上(右鍵paste/ctrl+v)操作時,該動作將觸發名為'paste'的剪貼簿事件,這個事件的觸發是在剪貼簿裡的資料插入到目標元素之前。如果目標元素(游標所在位置)是可編輯的元素(設定了contenteditable屬性的div。textarea並不行),貼上動作將把剪貼簿裡的資料,以最合適的格式,插入到目標元素裡;如果目標元素不可編輯,則不會插入資料,但依然觸發paste event。資料在貼上的過程中是隻讀的。

監聽了paste事件,也知道了表現形式,接下來就是如何獲取資料了:

chrome有特定的方法,利用clipboardData.items、getAsFile()、new FileReader()等api可以在paste回撥函式裡獲取到剪貼簿裡圖片的base64編碼字串(無論是截圖貼上的還是網頁圖片複製貼上的),ie11,firefox沒有這樣的api,不過依然有辦法可以獲取,因為資料已經表現在img的src裡了,對於截圖貼上的,直接取img的src屬性值(base64),對於網頁貼上的,則把地址傳給後臺,然後根據地址down下來,存在自己的伺服器,最後把新地址返回來交給前端展示就ok了。為了保持一致性便於管理,統一將所有情況(截圖、網頁)中的img的src屬性替換為自己儲存的地址。

完整例子:

<!DOCTYPEhtml>
<html>

<head>
<metacharset="UTF-8">
<title>Js實現貼上上傳圖片</title>
<scriptsrc="jquery.js"></script>
</head>

<body>
複製貼上上傳圖片:
<divid="content_img"contentEditable="true"style="width:500px;height:500px;border:1pxsolid#000;"></div>
<script>
document.getElementById('content_img').addEventListener('paste',function(e){
if(!(e.clipboardData&&e.clipboardData.items)){
return;
}
for(vari=0,len=e.clipboardData.items.length;i<len;i++){
varitem=e.clipboardData.items[i];
if(item.kind==="string"){
item.getAsString(function(str){
console.log(str);
alert("請貼上圖片上傳");
})
$("#content_img").html("");
}elseif(item.kind==="file"){
varblob=item.getAsFile();
console.log(blob);
if(blob.size===0){
return;
}
vardata=newFormData();
data.append("image",blob);
$.ajax({
url:"http://www.yzmcms.com/upload.php",type:'POST',cache:false,data:data,processData:false,contentType:false,dataType:"json",success:function(result){
console.log(result);
if(result.status){
varhtml="<imgsrc="+result.data+"width='100'height='100'>";
$("#content_img").append(html);
}else{
console.log(result.message)
}
}
});

//阻止預設行為即不讓剪貼簿內容在div中顯示出來
e.preventDefault();
}
}
});
</script>
</body>

</html>

以上就是Js實現貼上上傳圖片的原理及示例的詳細內容,更多關於JS 貼上上傳圖片的資料請關注我們其它相關文章!