整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端开发-HTML5 如何拖拽上传文件?

<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>前端开发-拖拽上传文件</title>
</head>
<body>
  
<script>
document.ondragover = (e) => {
  e.preventDefault()
}
document.ondrop = (e) => {
  e.preventDefault()
  // 某些版本的 Firefox 无视 preventDefault
  // 需要执行 stopImmediatePropagation 防止浏览器打开文件
  e.stopImmediatePropagation()
  const file = e.dataTransfer.files[0]
  const img = new Image()
  img.src = URL.createObjectURL(file)
  document.body.appendChild(img)

  console.log(file)
  // 如何上传文件?
  // 参见 https://www.toutiao.com/article/7298667864926536242/
}
</script>

</body>
</html>

件拖拽上传

使用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;

在本例中, 我们用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.URL.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提交文件流。

TML5

拖放(Drag 和 drop)是 HTML5 标准的组成部分。

拖放的事件效果在我们的生活中经常用到,比如我们打开电脑给别人发送一个文件或图片,我们一般都是把文件图片点击按住然后直接拖放到我们的留言区,然后直接就给发送过去了。还有就是我们在拷贝文件或图片的时候也是,直接把文件拖进来的,很少有用右键复制来拷贝的,所以,这样的操作是不是很方便呢?那么,这样的效果我们又怎么实现呢?

其实,这样的效果很简单,今天我们就来实现一个简单的图片拖放功能,我们来看一下代码就知道了!

新建一个index.html文件

index.html

第一,拖动什么?用ondragstart和setData()

ondragstart 属性调用了一个函数,drag(event),它规定了被拖动的数据。

第二,拖放到何处?用ondragover,ondragover 事件规定在何处放置被拖动的数据。

这要通过调用 ondragover 事件的 event.preventDefault() 方法。

第三,放置到哪里?用ondrop,当放置被拖数据时,会发生 drop 事件。

另外新建一个demo.js文件

demo.js

demo.js

拖放效果图

看完是不是觉得很简单呢?

虽然,这些看似简单的东西,但常常是在我们不经意的时候就成了一个强大的酷炫的东西了。所以说,我们常看的高大上的动画效果,其实都是这些简单的知识堆积而成的,只要我们把基础打扎实了,这些效果就慢慢地显露出来了。

如果觉得本期内容不错,记得在下方给我留言!下期小编会有更好的干货分享哦!