当前位置:  开发笔记 > 编程语言 > 正文

HTML5直接拖拽文件上传到服务器附源代码

通过HTML的文件API,Firefox、Chrome等浏览器已经支持从操作系统直接拖拽文件,并上传到服务器。相对于使用了十多年的HTML表单,这是一个革命性的进步。虽然IE的落后让很多开发者还在观望中,但是Gmail邮箱的附件拖拽功能已经给部分用户带来了极大的方便,">

     通过HTML的文件API ,Firefox、Chrome等浏览器已经支持从操作系统直接拖拽文件,并上传到服务器。

     相对于使用了十多年的HTML表单,这是一个革命性的进步。虽然IE的落后让很多开发者还在观望中,但是Gmail邮箱的附件拖拽功能已经给部分用户带来了极大的方便,而需要大量上传文件的CMS(内容管理系统)也将会从中受益。    

     让我们看一下Firefox 是如何使用拖拽上传功能的:

     首先提供一个区域来放置文件

     Html代码

 

 

 

 

然后监听拖拽过程中的dragenter、dragleave、drop等事件

Js代码

 

document.addEventListener("dragenter", function(e){ 
    dropbox.style.borderColor = 'gray'; 
}, false); 
document.addEventListener("dragleave", function(e){ 
    dropbox.style.borderColor = 'silver'; 
}, false); 
dropbox.addEventListener("dragenter", function(e){ 
    dropbox.style.borderColor = 'gray'; 
    dropbox.style.backgroundColor = 'white'; 
}, false); 
dropbox.addEventListener("dragleave", function(e){ 
    dropbox.style.backgroundColor = 'transparent'; 
}, false); 
dropbox.addEventListener("dragenter", function(e){ 
    e.stopPropagation(); 
    e.preventDefault(); 
}, false); 
dropbox.addEventListener("dragover", function(e){ 
    e.stopPropagation(); 
    e.preventDefault(); 
}, false); 
dropbox.addEventListener("drop", function(e){ 
    e.stopPropagation(); 
    e.preventDefault(); 
     
    handleFiles(e.dataTransfer.files); 
     
    submit.disabled = false; 
}, false); 

 

其中最主要的是drop事件中用handleFiles()依次处理所有文件

 

Js代码
handleFiles = function(files) { 
    for (var i = 0; i         var file = files[i]; 
 
    } 

对于图片类型的文件可以直接读取内容,显示预览图

 

Js代码
 

 

if (!file.type.match(/image*/)) { 
    continue; 

 
var img = document.createElement("img"); 
img.classList.add("obj"); 
img.file = file; 
preview.appendChild(img); 
 
var reader = new FileReader(); 
reader.Onload= (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img); 
reader.readAsDataURL(file); 

 

接下来就是核心功能:ajax上传。首先新建一个XHR请求

 

Js代码
 

var xhr = new XMLHttpRequest(); 
xhr.open('post', '/file/upload', true); 

 

监听上传进度和完成事件

 
Js代码
xhr.upload.addEventListener("progress", function(e) { 
    if (e.lengthComputable) { 
        var percentage = Math.round((e.loaded * 100) / e.total); 
        img.style.opacity = 1-percentage/100.0; 
    } 
}, false); 
 
xhr.upload.addEventListener("load", function(e){ 
     
}, false); 

最后把数据模拟成multipart/form-data的格式上传

 

Js代码
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary); // simulate a file MIME POST request. 
xhr.setRequestHeader("Content-Length", fileSize); 
 
var body = ''; 
body += "--" + boundary + "\r\n"; 
body += "Content-Disposition: form-data; name=\""+dropbox.getAttribute('name')+"\"; filename=\"" + fileName + "\"\r\n"; 
body += "Content-Type: "+fileType+"\r\n\r\n"; 
body += fileData + "\r\n"; 
body += "--" + boundary + "--\r\n"; 
 
xhr.sendAsBinary(body); 

 


推荐阅读
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 探索JavaScript倒计时功能的三种高效实现方法及代码示例 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • 前面简单总结了js的基本语法,其实js语法和java、C语言语法有很多的相同之处;接下来将总结js在WEB浏览器中的运用,这部门将要了解的 ... [详细]
  • 在处理大文件上传时,服务端为何无法直接接收?这主要与 PHP 配置文件 `php.ini` 中的几个关键参数有关,如 `upload_max_filesize` 和 `post_max_size`。这些参数分别限制了单个文件的最大上传大小和整个 POST 请求的数据量。为了实现大文件的高效上传,可以通过文件分割与分片上传的方法来解决。本文将详细介绍这一实现方法,并提供相应的代码示例,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 如何在服务器后台运行PHP脚本?
    如何在服务器后台运行PHP脚本? ... [详细]
  • 探讨.NET技术与Silverlight中控件拖放及复制功能的实现方法
    Silverlight拖动复制控件,就是将控件从一个容器中向另一个容器中拖动时,不是移动控件而把该控件到另一个容器中。这种情形在程序中经常遇到ÿ ... [详细]
  • 在Laravel中实现PHP对JSON数据的发布与处理 ... [详细]
  • HTML5大文件传输技术深度解析与实践分享
    本文深入探讨了HTML5在Web前端开发中实现大文件上传的技术细节与实践方法。通过实例分析,详细讲解了如何利用HTML5的相关特性高效、稳定地处理大文件传输问题,并提供了可供参考的代码示例和解决方案。此外,文章还讨论了常见的技术挑战及优化策略,旨在帮助开发者更好地理解和应用HTML5大文件上传技术。 ... [详细]
  • IDM 6.38 免费激活版:适用于电脑、手机及浏览器插件的长期解决方案
    IDM 6.38 免费激活版:适用于电脑、手机及浏览器插件的长期解决方案 ... [详细]
  • 代码:headersAccept:texthtml,applicationxhtml+xml,applicationxml;q0.9,imagewebp,image ... [详细]
  • 开发工具WebDeveloper1.1.8https:addons.mozilla.orgen-USfirefoxaddon60以工具栏的形式对网页的(X)HTML、脚本、多媒体、 ... [详细]
author-avatar
周球球J_218
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有