file upload via dragndrop
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>File upload with drag and drop progress bar</title>
<style>
.dropzone {
width: 300px;
height: 300px;
border: 2px dashed #ccc;
color: #ccc;
line-height: 300px;
text-align: center;
}
.dropzone.dragover {
border-color: black;
color: black;
}
</style>
</head>
<body>
<h2>Html5 file upload progress bar and drag and drop</h2>
<div id="uploads"></div>
<form id="upload_form" enctype="multipart/form-data" method="post">
<input type="file" name="uploaded" id="uploaded"><br>
<input type="button" value="Upload file" id="upload_btn">
<div class="dropzone" id="dropzone">Drop files here to upload</div>
<progress id="progressbar" value="0" max="100" style="width: 300px"></progress>
<h3 id="status"></h3>
<p id="loaded"></p>
</form>
<script>
(function(){
var uploaded = document.getElementById('uploaded'),
dropzone = document.getElementById('dropzone'),
btn = document.getElementById('upload_btn'),
progressBar = document.getElementById('progressbar'),
status = document.getElementById('status'),
loaded = document.getElementById('loaded'),
uploads = document.getElementById('uploads');
btn.addEventListener('click',uploadHandler, false);
dropzone.addEventListener('dragenter',dragoverHandler, false);
dropzone.addEventListener('dragleave',dragleaveHandler, false);
dropzone.addEventListener('drop', dropHandler, false);
window.addEventListener('dragover', function(e){
e.preventDefault();
});
function dropHandler(e){
e.preventDefault();
//console.log(e);
//console.log(e.dataTransfer);
//console.log(e.dataTransfer.files);
this.classList.remove('dragover');
var files = e.dataTransfer.files,
formData = new FormData(),
xhr = new XMLHttpRequest(),
numberOfFiles = files.length;
for(var i = 0; i < numberOfFiles; i++) {
formData.append('uploads[]', files[i]);
}
xhr.onload = function(){
var data = JSON.parse(this.responseText);
displayUploads(data);
}
xhr.open('post', 'file_uploaded_parser.php');
xhr.send(formData);
}
function dragoverHandler(){
this.classList.add('dragover');
//this.className = 'dropzone dragover';
return false;
}
function dragleaveHandler(){
this.classList.remove('dragover');
return false;
}
function displayUploads(data){
var message,
numberOfElements = data.length;
for(var i = 0; i < numberOfElements; i++) {
message = document.createElement('a');
message.href = data[i].file;
message.innerHTML = data[i].name;
uploads.appendChild(message);
}
}
function uploadHandler(e){
var formdata = new FormData();
formdata.append('uploaded', uploaded.files[0]);
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', progressHandler, false);
xhr.addEventListener('load', completeHandler, false);
xhr.addEventListener('error', errorHandler, false);
xhr.addEventListener('abort', abortHandler, false);
xhr.open('POST', 'file_upload_parser.php');
xhr.send(formdata);
}
function progressHandler(event){
var percent = event.loaded/event.total*100;
loaded.innerHTML = 'Uploaded ' + event.loaded + ' bytes of ' + event.total;
progressbar.value = Math.round(percent);
status.innerHTML = Math.round(percent) + '% uploaded...please wait';
}
function completeHandler(event){
status.innerHTML = event.target.responseText;
progressbar.value = 0;
}
function errorHandler(){
status.innerHTML = 'Upload failed';
}
function abortHandler(){
status.innerHTML = 'Upload aborted';
}
})();
</script>
</body>
</html>