Skip to content

Instantly share code, notes, and snippets.

@p34eu
Last active July 7, 2018 08:24
Show Gist options
  • Save p34eu/86fe12386e1ff326eb0682e86bbe30bb to your computer and use it in GitHub Desktop.
Save p34eu/86fe12386e1ff326eb0682e86bbe30bb to your computer and use it in GitHub Desktop.
jQuery html5 drag drop file upload progress preview mime list json response event csrf-token
(function ($) {
//based on that nice demo at https://html5demos.com/dnd-upload/
$.fn.upl = function (options) {
var tests = {
filereader: typeof FileReader != 'undefined',
dnd: 'draggable' in document.createElement('span'),
formdata: !!window.FormData,
progress: "upload" in new XMLHttpRequest
},
acceptedTypes = {
'image/png': true,
'image/jpeg': true,
'image/gif': true
},
settings = $.extend({
route: '/set_the_path_to_server_here.php',
progress: '.progress',
preview: '.preview',
name: 'files'
}, options);
var previewfile = function (file, el) {
var preview = $(el).find(settings.preview)[0];
if (!acceptedTypes[file.type] === true) {
preview.innerHTML += file.name + ' not supported type: ' + file.type + '\n';
return false;
}
if (tests.filereader === true) {
var reader = new FileReader();
reader.onload = function (event) {
var image = new Image();
image.src = event.target.result;
preview.appendChild(image);
};
reader.readAsDataURL(file);
} else {
preview.innerHTML += '<p>Uploaded ' + file.name + ' ' + (file.size ? (file.size / 1024 | 0) + 'K' : '');
}
};
var readfiles = function (files, el) {
var progress = $(el).find(settings.progress)[0];
var formData = tests.formdata ? new FormData() : null;
var csrf = document.head.querySelector('meta[name="csrf-token"]').content;
if (tests.formdata) {
for (var i = 0; i < files.length; i++) {
formData.append(settings.name + '[' + i + ']', files[i]);
previewfile(files[i], el);
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
$(el).trigger("completed",xhr.responseText);
}
}
xhr.open('POST', settings.route);
if (csrf != undefined) {
xhr.setRequestHeader('X-CSRF-TOKEN', csrf);
}
if (tests.progress) {
xhr.upload.onprogress = function (event) {
if (event.lengthComputable) {
var complete = (event.loaded / event.total * 100 | 0);
progress.value = progress.innerHTML = complete;
}
}
xhr.onload = function () {
progress.value = progress.innerHTML = 100;
setTimeout(function(){
progress.value = progress.innerHTML = 0;
},2000);
};
}
xhr.send(formData);
} else {
$(el).find(settings.preview)[0].innerHTML = 'File upload not supported.';
}
}
this.each(function (i, el) {
var inp = $('<input type="file" style="display: none" name="' + settings.name + '[]">').on('change', function (e) {
readfiles(e.target.files, el);
});
var preview = $(el).find(settings.preview)[0];
inp.insertAfter(preview);
$(preview).on('click', function () {
inp.trigger('click');
})
if (tests.dnd) {
el.ondragover = function (e) {
// el.className = 'hover';
e.stopPropagation();
return false;
};
el.ondragend = function (e) {
//el.className = '';
e.stopPropagation();
return false;
};
el.ondrop = function (e) {
// el.className = '';
e.preventDefault();
e.stopPropagation();
if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {
readfiles(e.dataTransfer.files, el);
}
}
}
}); //each
};
}(jQuery));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment