Bonjour,
Je suis en train de créer une zone d'administration via Laravel. Je me suis lancé dans la création d'un système d'upload de fichier par drag and drop.
J'ai suivi le tutoriel que notre cher @Grafikart avait fait il y a quelques temps (https://www.grafikart.fr/tutoriels/upload-drop-172) . Donc, voici mon code source jquery que je met ici pour voir votre avis et que vous m'aidiez à le terminer.
//Code jquery
(function($){
//Tableau des options
var option = {
limit: 1,
message: 'Glissez votre fichier ici',
message2: 'Relachez votre fichier',
script: 'upload.php',
csrf: '',
progressbar: '.progression'
}
$.fn.dropfile = function(option){
//Listage des div qui serviront à l'uploads
this.each(function(oo){
if(oo) $.extend(option, oo);
$('<span>').append(option.message).appendTo(this);
$(this).bind({
dragenter: function(e){
//e.stopPropagation();
e.preventDefault();
$(this).text(option.message2).addClass('border-upload_hover');
},
dragover: function(e){
//e.stopPropagation();
e.preventDefault();
$(this).text(option.message2).addClass('border-upload_hover');
},
dragleave: function(e){
//e.stopPropagation();
e.preventDefault();
$(this).text(option.message).removeClass('border-upload_hover');
},
});
this.addEventListener(
'drop',
function(e){
e.preventDefault();
files = e.dataTransfer.files;
if(option.limit >= files.length)
{
for(var i= 0; i < files.length; i++)
{
progressbar(option, 'file'+i);
var fd = new FormData();
fd.append('file', files[i]);
uploadData(fd, 'file'+i);
};
console.log('fini')
}
else
{
$(this).text(option.message).removeClass('border-upload_hover');
$(".error").html(
"<div class=\"sufee-alert alert with-close alert-danger alert-dismissible fade show\">" +
"<span class=\"badge badge-pill badge-danger\">Erreur</span>" +
"Vous êtes limité à " + option.limit + " fichiers" +
"<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\">" +
"<span aria-hidden=\"true\">×</span>" +
"</button>" +
"</div>");
}
},
false);
});
function progressbar(option, div){
var $structure = '<div class="row">\n' +
'<div class="col-md-12">\n' +
'<div class="progress mb-2">\n' +
'<div id="progress" class="progress-bar progress-bar-striped bg-success progress-bar-animated ' + div +'" role="progressbar" style="width: 0%;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0%</div>\n' +
'</div>\n' +
'</div>\n' +
'</div>';
$(option.progressbar).append($structure);
}
function uploadData(formdata, div){
$.ajax({
xhr: function () {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener("progress", function (evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
$('.'+div).css({width: percentComplete * 100 + '%'}).text(percentComplete.toFixed(2) * 100 + '%');
}
}, false);
xhr.addEventListener("progress", function (evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
$('.'+div).css({width: percentComplete * 100 + '%'}).text(percentComplete.toFixed(2) * 100 + '%');
}
}, false);
return xhr;
},
url: option.script,
headers: {
'X-CSRF-TOKEN': option.csrf
},
type: 'post',
data: formdata,
contentType: false,
processData: false,
dataType: 'json',
success: function(response){
}
});
}
}
})(jQuery);
Et mon appel à mon plugin:
jQuery(function ($) {
$("#uploadfile").dropfile({
limit: 99,
message: 'Glissez votre fichier ici',
message2: 'Relachez votre fichier',
csrf: $('meta[name="csrf-token"]').attr('content'),
script: '{{ route('Admin.Profile.PostsUploads') }}',
progressbar: '.progression'
})
});
Et enfin ma structure html pour que cela fonctionne (structure basé sur bootstrap).
<div class="col-md-11">
<div class="error">
</div>
<input type="file" name="file" id="file">
<div class="border-upload text-center align-middle dragandrop-profile upload-area" id="uploadfile">
</div>
<br />
<div class="progression"></div>
</div>
Mon script fonctionne pour ce qui est de l'upload de fichier. Hors, je pense qu'il y a encore du travail.
Ce que j'attend est très simple, votre avis, vos remarques et votre aide pour les derniers points qui me sont encore un peu flou.
Amicalement