Drag and Drop Upload files using Ajax
Remember when we used to choose a file by clicking on "browse ..."? Then we had to repeat if we need to upload multiple files.
Well, hopefully you want to change that painful process to a modern way and here's a simple solution that will help you.
Here's some benefits using this technique:
- Drag and Drop
- Multiple File Uploads
- Limit the filesize
- Specify file types
- Real-time progress indicator
- Provide instant feedback
HTML
First of all, let's create a simple HTML and put the fancy "drag and drop" area.
<!DOCTYPE html> <html> <head> <title>Drag & Drop Upload</title> <meta charset="utf-8" /> <script src="jquery-1.7.1.min.js"></script> <script src="upload.js"></script> <link rel="stylesheet" href="upload.css"> </head> <body> <h1>Drop file below</h1> <div id="error"></div> <section id="uploadBox"> Drop files here! </section> <section id="uploadStatus"> <div id="progressWrapper"> <div id="progressBar"></div> <div id="progressValue">0%</span> </div> </section> </body> </html>
CSS
Now, let's make it pretty
.active { background: #ddd; } section#uploadStatus { display: none; margin: 20px 0; } #error { background: #ffbaba; border: 1px solid; color: red; display: none; font: bold 12px verdana; margin: 15px 0px; padding: 5px; width: 400px; } #progressWrapper { background: #ddd; -webkit-border-radius: 10px; border-radius: 10px; padding: 3px; position: relative; width: 400px; } #progressWrapper #progressBar { background-color: #61abed; border-radius: 10px; height: 20px; position: relative; width: 0%; } #progressWrapper #progressValue{ font: bold 12px verdana; position: absolute; top: 5px; left: 50%; } section#uploadBox { border: 2px dashed #707070; color: #6E6E6E; height: 70px; padding-top: 50px; text-align: center; width: 400px; }
Javascript/jQuery
Now, let's have the javascript code that will do all the work for you.
var maxFileSize = 1048576; //Kb $(document).ready(function() { if (typeof FormData == "undefined") { $('#error').html('Unable to drop files').fadeIn('fast'); $('#uploadBox').hide(); } jQuery.event.props.push('dataTransfer'); $('#uploadBox') .bind('dragenter', function(e) { $(this).addClass("active"); e.stopPropagation(); e.preventDefault(); }) .bind('dragleave', function(e) { $(this).removeClass("active"); e.stopPropagation(); e.preventDefault(); }) .bind('dragover', function(e) { e.stopPropagation(); e.preventDefault(); }) .bind('drop', function(e) { $(this).removeClass("active"); e.stopPropagation(); e.preventDefault(); var files = e.dataTransfer.files; var imagetype = /image.*/; /* Multiple Uploads */ var xhr, provider; var formData = new FormData(); var numberFiles = files.length; for(i = 0; i < numberFiles; ++i) { if (!files[i].type.match(imagetype)) { // display some message continue; } if (files[i].size > maxFileSize) { // display some message continue; } formData.append('uploadedFile[]', files[i]); } $('#error').html('').fadeOut(0); $.ajax({ cache: false, contentType: false, data: formData, processData: false, url: 'upload.php', type: 'POST', xhr: function() { xhr = jQuery.ajaxSettings.xhr(); if (xhr.upload) { $('#uploadStatus').show(); xhr.upload.addEventListener('progress', function (e) { var p = parseInt(e.loaded/e.total*100); $('#progressBar').css({'width':p+'%'}); $('#progressValue').html(p+'%'); }, false); } return xhr; }, beforeSend: function() { $('#progressBar').css({'width':'0%'}); $('#progressValue').html('0%'); }, success: function(output) { // good to go }, error: function() { }, }); }); });
Then on your PHP file, you will have to process them and move then to the desired folder. The structure looks like this:
Array ( [uploadedFile] => Array ( [name] => Array ( [0] => wallpaper1.jpg [1] => fog-wallpaper1920x1080.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg ) [tmp_name] => Array ( [0] => /tmp/phpAX0VFl [1] => /tmp/phpMusPc0 ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 651673 [1] => 482223 ) ) )
PHP
<?php define('UPLOAD_DIR', '/tmp/test/'); foreach ($_FILES['uploadedFile']['name'] as $key => $value) { if ($_FILES['uploadedFile']['error'][$key] == UPLOAD_ERR_OK) { $result = move_uploaded_file($_FILES['uploadedFile']['tmp_name'][$key], UPLOAD_DIR . '/' . $_FILES['uploadedFile']['name'][$key]); // do what ever you need! } }