- 作(zuò)者:admin
- 發表時(shí)間(jiān):2013-07-02 14:16:58
- 來(lái)源:未知
使用HTML5的文件API,可(kě)以将操作(zuò)系統中的文件拖放到浏覽器(qì)的指定區(qū)域,實現文件上(shàng)傳到服務器(qì)。本文将結合實例講解HTML5+jQuery+PHP實現拖拽上(shàng)傳圖片的過程,來(lái)看下HTML5的魅力吧(ba)。
HTML
我們在頁面中放置一個(gè)拖拽區(qū)域#drop_area,即接收拖拽的區(qū)域,#preview用來(lái)預覽拖拽上(shàng)傳的圖片信息。
将圖片拖拽到此區(qū)域
Javascript
要想實現拖拽,頁面需要阻止浏覽器(qì)默認行(xíng)為(wèi),即四個(gè)事件(拖離、拖後放、拖進、拖來(lái)拖去),因為(wèi)我們要阻止浏覽器(qì)默認将圖片打開(kāi)的行(xíng)為(wèi),這裏我們使用jQuery來(lái)完成。
$(function(){
//阻止浏覽器(qì)默認行(xíng)。
$(document).on({
dragleave:function(e){ //拖離
e.preventDefault();
},
drop:function(e){ //拖後放
e.preventDefault();
},
dragenter:function(e){ //拖進
e.preventDefault();
},
dragover:function(e){ //拖來(lái)拖去
e.preventDefault();
}
});
...
});
接下來(lái)我們來(lái)了解下文件API。HTML5的文件API有(yǒu)一個(gè)FileList接口,它可(kě)以通(tōng)過e.dataTransfer.files拖拽事件傳遞的文件信息,獲取本地文件列表信息。
var fileList = e.dataTransfer.files;
使用files 方法将會(huì)獲取到拖拽文件的數(shù)組形勢的數(shù)據,每個(gè)文件占用一個(gè)數(shù)組的索引,如果該索引不存在文件數(shù)據,将返回 null 值。可(kě)以通(tōng)過length屬性獲取文件數(shù)量.
var fileNum = fileList.length;
在本例中,我們用javascript來(lái)偵聽(tīng)drop事件,首先要判斷拖入的文件是否符合要求,包括圖片類型、大(dà)小(xiǎo)等,然後獲取本地圖片信息,實現預覽,最後上(shàng)傳。
$(function(){
...接上(shàng)部分
var box = document.getElementById('drop_area'); //拖拽區(qū)域
box.addEventListener("drop",function(e){
e.preventDefault(); //取消默認浏覽器(qì)拖拽效果
var fileList = e.dataTransfer.files; //獲取文件對象
//檢測是否是拖拽文件到頁面的操作(zuò)
if(fileList.length == 0){
return false;
}
//檢測文件是不是圖片
if(fileList[0].type.indexOf('image') === -1){
alert("您拖的不是圖片!");
return false;
}
//拖拉圖片到浏覽器(qì),可(kě)以實現預覽功能
var img = window.webkitURL.createObjectURL(fileList[0]);
var filename = fileList[0].name; //圖片名稱
var filesize = Math.floor((fileList[0].size)/1024);
if(filesize>500){
alert("上(shàng)傳大(dà)小(xiǎo)不能超過500K.");
return false;
}
var str = "
圖片名稱:"+filename+"
大(dà)小(xiǎo):"+filesize+"KB
";
$("#preview").html(str);
//上(shàng)傳
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模拟表單數(shù)據,直接将數(shù)據append到formdata對象中,實現了ajax上(shàng)傳。
PHP
upload.php用于接收上(shàng)傳的文件信息,完成上(shàng)傳,實現代碼如下:
512000) {
echo '圖片大(dà)小(xiǎo)不能超過500k';
exit;
}
$type = strstr($picname, '.');
if ($type != ".gif" && $type != ".jpg") {
echo '圖片格式不對!';
exit;
}
$pics = 'helloweba' . $type;
//上(shàng)傳路徑
$pic_path = "pics/". $pics;
move_uploaded_file($mypic["tmp_name"],$pic_path);
}
?>
最後總結下HTML5實現拖拽上(shàng)傳的技(jì)術(shù)要點:
1、監聽(tīng)拖拽:監聽(tīng)頁面元素的拖拽事件,包括:dragenter、dragover、dragleave和(hé)drop,一定要将dragover的默認事件取消掉,不然無法觸發drop事件。如需拖拽頁面裏的元素,需要給其添加屬性draggable=”true”;
2、獲取拖拽文件:在drop事件觸發後通(tōng)過e.dataTransfer.files獲取拖拽文件列表,.length屬性獲取文件數(shù)量,.type屬性獲取文件類型。
3、讀取圖片數(shù)據并添加預覽圖。
4、發送圖片數(shù)據:使用FormData模拟表單數(shù)據AJAX提交文件流。
合作(zuò)
咨詢
建站(zhàn)咨詢