HTML5應用之檔案拖拽上傳
HTML
我們在頁面中放置一個拖拽區域#drop_area,即接收拖拽的區域,#preview用來預覽拖拽上傳的圖片資訊。
<div id="drop_area">將圖片拖拽到此區域</div>
<div id="preview"></div>
Javascript
要想實現拖拽,頁面需要阻止瀏覽器預設行為,即四個事件(拖離、拖後放、拖進、拖來拖去),因為我們要阻止瀏覽器預設將圖片開啟的行為,這裡我們使用jQuery來完成。
$(function(){
//阻止瀏覽器預設行。
$(document).on({
dragleave:function (e){ //拖離
e.preventDefault();
},
drop:function(e){ //拖後放
e.preventDefault();
},
dragenter:function(e){ //拖進
e.preventDefault();
},
dragover:function(e){ //拖來拖去
e.preventDefault();
}
} );
...
});
接下來我們來了解下檔案API。HTML5的檔案API有一個FileList介面,它可以通過e.dataTransfer.files拖拽事件傳遞的檔案資訊,獲取本地檔案列表資訊。
var fileList = e.dataTransfer.files;
使用files 方法將會獲取到拖拽檔案的陣列形勢的資料,每個檔案佔用一個數組的索引,如果該索引不存在檔案資料,將返回 null 值。可以通過length屬性獲取檔案數量.
var fileNum = fileList.length;
在本例中,我們用javascript來偵聽drop事件,首先要判斷拖入的檔案是否符合要求,包括圖片型別、大小等,然後獲取本地圖片資訊,實現預覽,最後上傳。
$(function(){
...接上部分
var box = document.getElementById('drop_area'); //拖拽區域
box.addEventListener("drop",function(e){
e.preventDefault(); //取消預設瀏覽器拖拽效果
var fileList = e.dataTransfer.files; //獲取檔案物件
//檢測是否是拖拽檔案到頁面的操作
if(fileList.length == 0){
return false;
}
//檢測檔案是不是圖片
if(fileList[0].type.indexOf('image') === -1){
alert("您拖的不是圖片!");
return false;
}
//拖拉圖片到瀏覽器,可以實現預覽功能
var img = window.webkitURL.createObjectURL(fileList[0]);
var filename = fileList[0].name; //圖片名稱
var filesize = Math.floor((fileList[0].size)/1024);
if(filesize>500){
alert("上傳大小不能超過500K.");
return false;
}
var str = "<img src='"+img+"'><p>圖片名稱:"+filename+"</p><p>大小:"+filesize+"KB</p>";
$("#preview").html(str);
//上傳
xhr = new XMLHttpRequest();
xhr.open("post", "upload.php", true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
var fd = new FormData();
fd.append('mypic', fileList[0]);
xhr.send(fd);
},false);
});
我們用FormData模擬表單資料,直接將資料append到formdata物件中,實現了ajax上傳。
PHP
upload.php用於接收上傳的檔案資訊,完成上傳,實現程式碼如下:
<?php
$mypic = $_FILES["mypic"];
if(!empty($mypic)){
$picname = $_FILES['mypic']['name'];
$picsize = $_FILES['mypic']['size'];
if ($picsize > 512000) {
echo '圖片大小不能超過500k';
exit;
}
$type = strstr($picname, '.');
if ($type != ".gif" && $type != ".jpg") {
echo '圖片格式不對!';
exit;
}
$pics = 'helloweba' . $type;
//上傳路徑
$pic_path = "pics/". $pics;
move_uploaded_file($mypic["tmp_name"],$pic_path);
}
?>
<meta charset="utf-8">
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="mypic">
<input type="submit" value="上傳">
</form>
最後總結下HTML5實現拖拽上傳的技術要點:
1、監聽拖拽:監聽頁面元素的拖拽事件,包括:dragenter、dragover、dragleave和drop,一定要將dragover的預設事件取消掉,不然無法觸發drop事件。如需拖拽頁面裡的元素,需要給其新增屬性draggable=”true”;
2、獲取拖拽檔案:在drop事件觸發後通過e.dataTransfer.files獲取拖拽檔案列表,.length屬性獲取檔案數量,.type屬性獲取檔案型別。
3、讀取圖片資料並新增預覽圖。
4、傳送圖片資料:使用FormData模擬表單資料AJAX提交檔案流。