惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
L
LINUX DO - 最新话题
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
S
Schneier on Security
C
Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
P
Privacy & Cybersecurity Law Blog
S
Security Archives - TechRepublic
Scott Helme
Scott Helme
PCI Perspectives
PCI Perspectives
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Attack and Defense Labs
Attack and Defense Labs
Hacker News: Ask HN
Hacker News: Ask HN
S
Security @ Cisco Blogs
S
Secure Thoughts
C
CERT Recently Published Vulnerability Notes
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cybersecurity and Infrastructure Security Agency CISA
The Last Watchdog
The Last Watchdog
T
Tenable Blog
SecWiki News
SecWiki News
T
The Exploit Database - CXSecurity.com
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
E
Exploit-DB.com RSS Feed
H
Heimdal Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
L
LINUX DO - 热门话题
The Hacker News
The Hacker News
P
Privacy International News Feed
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 叶小钗
Cloudbric
Cloudbric
小众软件
小众软件
月光博客
月光博客
S
Securelist
V
V2EX - 技术
I
Intezer
M
MIT News - Artificial intelligence
aimingoo的专栏
aimingoo的专栏
S
Security Affairs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
F
Full Disclosure
A
About on SuperTechFans

博客园 - Xproer-松鼠

PHP实现视频文件上传完整实例 ueditor 富文本编辑器粘贴图片时让图片居中 TinyMCE富文本编辑器粘贴图片自动上传问题解决 UEditor富文本编辑器图片粘贴和上传问题 vue项目中使用tinymce富文本编辑器实现图片上传/粘贴格式 富文本编辑器复制word文档中的图片 富文本编辑器:自己实现图片上传功能和图片粘贴上传(kindeditor) 前端上传文件或者上传文件夹 前端实现文件上传(点击+拖拽) 使用HTML5实现多文件上传 HTML5 文件上传的2种方式 html5实现文件批量上传组件 HTML5文件上传操作 html5中怎么实现多文件上传功能 HTML5 进阶系列:文件上传下载 html实现上传 大文件分片上传 【前后台完整版】大文件分片上传 大文件、视频分片上传,断点续传
HTML5应用之文件拖拽上传
Xproer-松鼠 · 2023-12-26 · via 博客园 - Xproer-松鼠

使用HTML5的文件API,可以将操作系统中的文件拖放到浏览器的指定区域,实现文件上传到服务器。本文将结合实例讲解HTML5+jQuery+PHP实现拖拽上传图片的过程,来看下HTML5的魅力吧。

HTML

我们在页面中放置一个拖拽区域#drop_area,即接收拖拽的区域,#preview用来预览拖拽上传的图片信息。

1 <div id="drop_area">将图片拖拽到此区域</div> 
2 <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事件,首先要判断拖入的文件是否符合要求,包括图片类型、大小等,然后获取本地图片信息,实现预览,最后上传。

 1 $(function(){ 
 2     ...接上部分 
 3     var box = document.getElementById('drop_area'); //拖拽区域 
 4     box.addEventListener("drop",function(e){ 
 5         e.preventDefault(); //取消默认浏览器拖拽效果 
 6         var fileList = e.dataTransfer.files; //获取文件对象 
 7         //检测是否是拖拽文件到页面的操作 
 8         if(fileList.length == 0){ 
 9             return false; 
10         } 
11         //检测文件是不是图片 
12         if(fileList[0].type.indexOf('image') === -1){ 
13             alert("您拖的不是图片!"); 
14             return false; 
15         } 
16          
17         //拖拉图片到浏览器,可以实现预览功能 
18         var img = window.webkitURL.createObjectURL(fileList[0]); 
19         var filename = fileList[0].name; //图片名称 
20         var filesize = Math.floor((fileList[0].size)/1024);  
21         if(filesize>500){ 
22             alert("上传大小不能超过500K."); 
23             return false; 
24         } 
25         var str = "<img src='"+img+"'><p>图片名称:"+filename+"</p><p>大小:"+filesize+"KB</p>"; 
26         $("#preview").html(str); 
27          
28         //上传 
29         xhr = new XMLHttpRequest(); 
30         xhr.open("post", "upload.php", true); 
31         xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
32          
33         var fd = new FormData(); 
34         fd.append('mypic', fileList[0]); 
35              
36         xhr.send(fd); 
37     },false); 
38 }); 

我们用FormData模拟表单数据,直接将数据append到formdata对象中,实现了ajax上传。

PHP

upload.php用于接收上传的文件信息,完成上传,实现代码如下:

 1 <?php 
 2 $mypic = $_FILES["mypic"]; 
 3 if(!empty($mypic)){ 
 4     $picname = $_FILES['mypic']['name']; 
 5     $picsize = $_FILES['mypic']['size']; 
 6     if ($picsize > 512000) { 
 7         echo '图片大小不能超过500k'; 
 8         exit; 
 9     } 
10     $type = strstr($picname, '.'); 
11     if ($type != ".gif" && $type != ".jpg") { 
12         echo '图片格式不对!'; 
13         exit; 
14     } 
15     $pics = 'helloweba' . $type; 
16     //上传路径 
17     $pic_path = "pics/". $pics; 
18     move_uploaded_file($mypic["tmp_name"],$pic_path); 
19 } 
20 ?> 
21 <meta charset="utf-8"> 
22 <form action="" method="post" enctype="multipart/form-data"> 
23 <input type="file" name="mypic"> 
24 <input type="submit" value="上传"> 
25 </form>  

最后总结下HTML5实现拖拽上传的技术要点:

1、监听拖拽:监听页面元素的拖拽事件,包括:dragenter、dragover、dragleave和drop,一定要将dragover的默认事件取消掉,不然无法触发drop事件。如需拖拽页面里的元素,需要给其添加属性draggable=”true”;

2、获取拖拽文件:在drop事件触发后通过e.dataTransfer.files获取拖拽文件列表,.length属性获取文件数量,.type属性获取文件类型。

3、读取图片数据并添加预览图。

4、发送图片数据:使用FormData模拟表单数据AJAX提交文件流。

参考文章:http://blog.ncmem.com/wordpress/2023/12/26/html5%e5%ba%94%e7%94%a8%e4%b9%8b%e6%96%87%e4%bb%b6%e6%8b%96%e6%8b%bd%e4%b8%8a%e4%bc%a0/

欢迎入群一起讨论