RELATEED CONSULTING
相關咨詢
選擇下列産品馬上(shàng)在線溝通(tōng)
服務時(shí)間(jiān):9:00-18:00
你(nǐ)可(kě)能遇到了下面的問題
關閉右側工具欄
HTML5應用之文件拖拽上(shàng)傳
  • 作(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提交文件流。