昨天我们介绍了一款HTML5文件上传的jQuery插件:jQuery HTML5 uploader,今天我们将开发一个简单的叫upload center的图片上传程序,允许用户使用拖拽方式来上传电脑上的图片,使用现在浏览器支持新的HTML5 API。
图片将会有一个预览和进度条,都由客户端控制。目前,图片都保存在服务器上的一个目录里,当然你可以自己加强相关功能。
什么是HTML文件上传?
使用HTML5上传文件其实综合使用了3种技术,新的File Reader API,还有新的Drag&Drop API,以及AJAX技术(包含2进制的数据传输)。这里是一个简单HTML5文件的描述:
1. 用户拖放一个或者多个文件到浏览器的窗口。支持Drap&Drop API的浏览器将会触发一个事件,以及相关的其它信息,包括一个拖拽文件列表。
2. 使用File Reader API, 我们以2进制方式读取文件,保存在内存中。
3. 使用XMLHttpRequest的新sendAsBinary方法 ,发送文件数据到服务器。
听起来是不是有点复杂?是的,可以使用一些优化。幸运的是,这里有些jQuery的插件可以帮助我们。其中有个插件叫Filedrop,是一个实现这个功能的插件,提供了限制最大文件体积和指定擦llback的特性,这些特性对于你整合这些功能非常有帮助。
目前文件上传功能只能在Firefox和Chrome上正常工作,但是将发布的主流浏览器也会支持这些功能。一个简单的fallback解决方案是显示一个一般的文件上传对话框。但是今天我们这里例子讲不这样设计,我们专注于HTML5的使用。
我们开始正式开发!
HTML代码
这个上传程序的html非常简单。我们使用一个一般的HTML5文档,包括了script.js文件,Filedrop插件和jQuery类库。
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>HTML5 File Drag and Drop Upload with jQuery and PHP | Tutorialzine Demo</title> <!-- Our CSS stylesheet file --> <link rel="stylesheet" href="assets/css/styles.css" /> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head> <body> <header> <h1>HTML5 File Upload with jQuery and PHP</h1> </header> <div id="dropbox"> <span class="message">Drop images here to upload. <br /><i>(they will only be visible to you)</i></span> </div> <!-- Including The jQuery Library --> <script src="http://code.jquery.com/jquery-1.6.3.min.js"></script> <!-- Including the HTML5 Uploader plugin --> <script src="assets/js/jquery.filedrop.js"></script> <!-- The main script file --> <script src="assets/js/script.js"></script> </body> </html>
和Filedrop有关的唯一一个div是#dropbox。我们将这个元素传入插件。插件将会判断是否一个文件被拖放到上面。当发现有错误的时候信息span将会被更新(例如,如果浏览器不支持和这个应用有关的HTML5 API的时候)。
最后,当你拖放一个文件,我们的jQuery代码将会显示一个预览,如下:
<div class="preview done"> <span class="imageHolder"> <img src="" /> <span class="uploaded"></span> </span> <div class="progressHolder"> <div class="progress"></div> </div> </div>
以上代码片断包含了一个图片预览和一个进度条。整个预览带有".done" class,可以让".upload" span显示。这个span将有绿色的背景标示,暗示上传完成了。
接下来,我们看看script.js文件!
jQuery代码
所有的实际文件传送功能都由Filedrop插件完成,我们只是简单的调用并且设置擦llback,因此我们可以直接使用。我们将在下一个部分书写一个PHP脚本处理服务器段的文件上传功能。
第一个步骤是书写一个辅助功能接受一个文件对象(一个特别的由浏览器创建的对象,包含名字,路径和大小)。以及预览的标签。
var template = '<div class="preview">'+ '<span class="imageHolder">'+ '<img />'+ '<span class="uploaded"></span>'+ '</span>'+ '<div class="progressHolder">'+ '<div class="progress"></div>'+ '</div>'+ '</div>'; function createImage(file){ var preview = $(template), image = $('img', preview); var reader = new FileReader(); image.width = 100; image.height = 100; reader.onload = function(e){ // e.target.result holds the DataURL which // can be used as a source of the image: image.attr('src',e.target.result); }; // Reading the file as a DataURL. When finished, // this will trigger the onload function above: reader.readAsDataURL(file); message.hide(); preview.appendTo(dropbox); // Associating a preview container // with the file, using jQuery's $.data(): $.data(file,preview); }
template变量包含了HTML5的预览标签。我们得到图片的DataURL并且添加为图片源。每一个都被添加到dropbox容器里。
现在我们调用filedrop插件:
$(function(){ var dropbox = $('#dropbox'), message = $('.message', dropbox); dropbox.filedrop({ // The name of the $_FILES entry: paramname:'pic', maxfiles: 5, maxfilesize: 2, // in mb url: 'post_file.php', uploadFinished:function(i,file,response){ $.data(file).addClass('done'); // response is the JSON object that post_file.php returns }, error: function(err, file) { switch(err) { case 'BrowserNotSupported': showMessage('Your browser does not support HTML5 file uploads!'); break; case 'TooManyFiles': alert('Too many files! Please select 5 at most!'); break; case 'FileTooLarge': alert(file.name+' is too large! Please upload files up to 2mb.'); break; default: break; } }, // Called before each upload is started beforeEach: function(file){ if(!file.type.match(/^image//)){ alert('Only images are allowed!'); // Returning false will cause the // file to be rejected return false; } }, uploadStarted:function(i, file, len){ createImage(file); }, progressUpdated: function(i, file, progress) { $.data(file).find('.progress').width(progress); } }); var template = '...'; function createImage(file){ // ... see above ... } function showMessage(msg){ message.html(msg); } });
使用这个,每一个正确的图片文件被拖放到#dropbox div都会被上传到post_file.php。
PHP Code
PHP这边的代码,和一般的表单上传没有太多区别。 这意味着你可以简单的提供fallback来重用后台功能。
// If you want to ignore the uploaded files, // set $demo_mode to true; $demo_mode = false; $upload_dir = 'uploads/'; $allowed_ext = array('jpg','jpeg','png','gif'); if(strtolower($_SERVER['REQUEST_METHOD']) != 'post'){ exit_status('Error! Wrong HTTP method!'); } if(array_key_exists('pic',$_FILES) && $_FILES['pic']['error'] == 0 ){ $pic = $_FILES['pic']; if(!in_array(get_extension($pic['name']),$allowed_ext)){ exit_status('Only '.implode(',',$allowed_ext).' files are allowed!'); } if($demo_mode){ // File uploads are ignored. We only log them. $line = implode(' ', array( date('r'), $_SERVER['REMOTE_ADDR'], $pic['size'], $pic['name'])); file_put_contents('log.txt', $line.PHP_EOL, FILE_APPEND); exit_status('Uploads are ignored in demo mode.'); } // Move the uploaded file from the temporary // directory to the uploads folder: if(move_uploaded_file($pic['tmp_name'], $upload_dir.$pic['name'])){ exit_status('File was uploaded successfuly!'); } } exit_status('Something went wrong with your upload!'); // Helper functions function exit_status($str){ echo json_encode(array('status'=>$str)); exit; } function get_extension($file_name){ $ext = explode('.', $file_name); $ext = array_pop($ext); return strtolower($ext); }
这段代码运行一些http检查,并且验证文件扩展。我们不想保存任何文件,所以这个我们直接删除。
CSS代码
/*------------------------- Dropbox Element --------------------------*/ #dropbox{ background:url('../img/background_tile_3.jpg'); border-radius:3px; position: relative; margin:80px auto 90px; min-height: 290px; overflow: hidden; padding-bottom: 40px; width: 990px; box-shadow:0 0 4px rgba(0,0,0,0.3) inset,0 -3px 2px rgba(0,0,0,0.1); } #dropbox .message{ font-size: 11px; text-align: center; padding-top:160px; display: block; } #dropbox .message i{ color:#ccc; font-size:10px; } #dropbox:before{ border-radius:3px 3px 0 0; } /*------------------------- Image Previews --------------------------*/ #dropbox .preview{ width:245px; height: 215px; float:left; margin: 55px 0 0 60px; position: relative; text-align: center; } #dropbox .preview img{ max-width: 240px; max-height:180px; border:3px solid #fff; display: block; box-shadow:0 0 2px #000; } #dropbox .imageHolder{ display: inline-block; position:relative; } #dropbox .uploaded{ position: absolute; top:0; left:0; height:100%; width:100%; background: url('../img/done.png') no-repeat center center rgba(255,255,255,0.5); display: none; } #dropbox .preview.done .uploaded{ display: block; } /*------------------------- Progress Bars --------------------------*/ #dropbox .progressHolder{ position: absolute; background-color:#252f38; height:12px; width:100%; left:0; bottom: 0; box-shadow:0 0 2px #000; } #dropbox .progress{ background-color:#2586d0; position: absolute; height:100%; left:0; width:0; box-shadow: 0 0 1px rgba(255, 255, 255, 0.4) inset; -moz-transition:0.25s; -webkit-transition:0.25s; -o-transition:0.25s; transition:0.25s; } #dropbox .preview.done .progress{ width:100% !important; }
.progress div是绝对定位的。修改width用来做一个自然进度的标示。使用0.25 突然四体on,你会看到一个动画的增量效果。
全部代码完毕。
大家可以用这个教程做为HTML5的文件上传服务的起点。有任何建议或者评论,只给我们在下方留言。
来源: http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost&gid=34464&tid=17975
相关推荐
在现代Web开发中,实时通信已经成为一个不可或缺的功能,特别是在构建互动性强、响应迅速的应用时。本文将深入探讨如何使用HTML5的WebSocket协议、PHP后端处理以及jQuery前端库来构建实时Web应用。WebSocket提供了一...
基于HTML5 WebSocket、PHP和jQuery的实时Web应用开发,提供了一种高效、实时地交换数据的方式。以下是相关的知识点详解: ### 实时Web应用概念 实时Web应用指的是那些能够实时响应用户行为或数据变化的应用,这类...
以上代码和步骤展示了如何使用jQuery实现一个简单的图片拖拽上传功能。请注意,实际应用中可能还需要考虑错误处理、进度指示、多文件上传、文件大小限制等功能。在开发过程中,请确保遵循最佳实践,如防止XSS攻击、...
【jQuery图片拖拽实例】是一个基于JavaScript库jQuery实现的交互式功能,允许用户通过鼠标拖动操作来移动页面上的图片。这个实例展示了如何利用jQuery的事件处理和DOM操作能力,为用户提供直观且易于使用的界面体验...
实现一个基于Jquery的表单验证插件。 1、初步运用了Jquery框架进行编程,基本掌握Jquery框架的使用。 2、熟练使用Jquery-validate表单验证插件,并熟知实现原理。 3、基本实现了一个基于Jquery的表单验证的调查问卷...
Spring是一个全面的企业级应用框架,提供了依赖注入和面向切面编程等功能,有助于简化Java应用程序的开发。Struts是MVC设计模式的实现,主要用于处理HTTP请求和响应,管理视图与控制器之间的交互。Hibernate是一个...
在本文中,我们将深入探讨如何使用jsPlumb和jQuery UI库构建一个基于Web的流程设计器,该设计器具有拖拽功能,并适用于多种主流浏览器。这个工具对于业务流程建模、工作流设计以及任何需要图形化表示流程的应用场景...
总的来说,这款基于Jquery插件的Web快速开发工具是Visual Studio开发环境的一个强大补充,尤其适用于那些频繁使用JqueryUI和Rozor视图引擎的Web开发者。它通过自动化和标准化的代码生成,降低了开发复杂性,提升了...
【基于JQuery的拖拽布局】是一个Web开发技术主题,主要涉及如何利用JQuery库实现网页元素的拖放功能,创建动态和交互式的用户界面。在这个项目中,开发者自行编写了必要的组件,使得用户可以通过鼠标操作移动页面上...
master`这个项目中,可能包含了实现上述功能的HTML、CSS和JavaScript代码,通过分析和学习这个示例,你可以深入理解如何结合HTML5、jQuery和Canvas来处理图片上传和旋转问题,这对于构建交互性强的移动Web应用非常有...
本实例主要关注的是使用jQuery 1.4.2版本实现的图片拖拽排序功能,这在创建图集、画廊或任何需要动态调整顺序的项目中非常实用。 首先,要理解拖拽排序的基本原理。拖拽排序涉及两个主要技术:事件监听和DOM操作。...
《jQuery移动Web开发(第二版)》是一本深入探讨如何使用jQuery进行移动Web应用开发的专业书籍。这本书籍的源代码包含在名为"jQuery-Mobile-Book-master"的压缩包中,为读者提供了丰富的实践示例和代码参考。jQuery,...
jQuery作为一个广泛使用的JavaScript库,提供了丰富的API和简洁的语法,使得开发者能够更轻松地实现复杂的前端功能,比如本例中的拖拽上传和批量上传。 拖拽上传是一种现代Web应用中提升用户体验的方式,用户可以将...
首先,jQuery Mobile是一个轻量级的框架,专门用于构建触屏友好的网页和应用。它基于jQuery库,提供了丰富的组件、主题系统以及优化的触控事件处理,使得开发者能够快速地创建一致的跨平台界面。jQuery Mobile的核心...
请注意,这只是一个基础的拖拽上传实现,实际应用中可能还需要处理上传到服务器、进度显示、多文件上传等更复杂的需求。在实际开发中,你可能需要结合后端接口,使用Ajax或Fetch API将图片数据发送到服务器进行存储...
建议开发童鞋使用跨平台开发工具——统一开发环境UDE来进行查看、调试、开发哦~~统一开发环境是一款HTML5跨平台一站式应用开发、调试和部署工具, 它支持HTML5跨平台开发,原有Java跨平台插件支持Android、Symbian、...
本篇文章将详细解析一个基于jQuery和HTML5的图片拖拽上传并预览的实现方案,通过分析项目中的`index.html`、`images`、`js`和`css`等文件,来深入理解这一技术的核心要点。 一、HTML5拖放API HTML5引入了拖放...