HTML5应用之文件拖拽上传

原创文章 作者:月光光 2012年10月17日 21:31helloweba.com 标签:HTML5  文件上传 

使用HTML5的文件API,可以将操作系统中的文件拖放到浏览器的指定区域,实现文件上传到服务器。本文将结合实例讲解HTML5+jQuery+PHP实现拖拽上传图片的过程,来看下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提交文件流。

声明:本文为原创文章,helloweba.net和作者拥有版权,如需转载,请注明来源于helloweba.net并保留原文链接:https://www.helloweba.net/javascript/192.html

11条评论

  • 先点个赞 回去试试

  • 赞一个

  • 用的什么插件也不说一下

  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3***/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3***/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    <style type="text/css">
    #drop_area{ width:300px; height:200px; background-color:#CCC; border:2px dashed #000000; text-align:center;}
    </style>
    <script type="text/javascript">
    function over(e){

    e.preventDefault();
    }
    function drop(e) {
    e.preventDefault();
    e.stopPropagation();
    //获取图片名称
    /*var filename = e.dataTransfer.files[0].name;*/
    var file = e.dataTransfer.files[0];
    //创建form表单,用来提交数据
    var form1 = new FormData();
    form1.append("aa", file);
    //提交数据
    var xhr = new XMLHttpRequest();
    xhr.open("post", "upload.php");
    xhr.send(form1);
    xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
    if (xhr.status == 200) {
    var img = document.createElement("img");
    img.src = xhr.responseText;
    img.width = 100;
    img.height = 100;
    e.target.appendChild(img);
    }
    }
    }
    }

    </script>
    </head>
    <body>
    <div id="drop_area" ondragover="over(event)" ondrop="drop(event)">将图片拖拽到此区域</div>
    </body>
    </html>

  • var fileList = e.dataTransfer.files[0];

  • 为恶恶

  • 为什么 var fileList = e.dataTransfer.files; //获取文件对象 这里执行会失败呢?

  • 请问可不可以 直接拖拽 然后不需要 点击 按钮,完全 js上传呢

  • cool

  • 漂亮!

  • nice!