125 votes

Quelqu'un peut-il expliquer comment mettre en œuvre le plugin jQuery File Upload ?

EDIT :

Cela semble toujours attirer du trafic, alors je vais expliquer ce que j'ai fini par faire. J'ai finalement réussi à faire fonctionner le plugin en suivant le tutoriel de Subrat, qui est la réponse acceptée. Cependant, jQuery File Upload est un véritable casse-tête et si vous cherchez un plugin simple pour le téléchargement de fichiers, je vous recommande vivement de suivre les conseils suivants Uploadify (merci CORSAIR !). Comme une réponse l'a souligné, il n'est gratuit que pour une utilisation non commerciale.

Contexte

J'essaie d'utiliser la méthode de Blueimp. jQuery File Upload pour permettre aux utilisateurs de télécharger des fichiers. Hors de la boîte, il fonctionne parfaitement en suivant les instructions d'installation. Mais pour l'utiliser de manière pratique sur mon site web, je veux pouvoir faire quelques choses :

  • Inclure l'uploader sur n'importe laquelle de mes pages existantes
  • Changez le répertoire pour les fichiers téléchargés

Tous les fichiers du plugin sont situés dans un dossier sous la racine.

J'ai essayé...

  • Déplacement de la page de démonstration dans le Root et mise à jour des chemins pour les scripts nécessaires
  • Modifier les options 'upload_dir' et 'upload_url' dans le fichier UploadHandler.php comme suggéré. ici .
  • Changer l'url dans la deuxième ligne du javascript de la démo

Dans tous les cas, l'aperçu s'affiche et la barre de progression s'exécute, mais le téléchargement des fichiers échoue et j'obtiens cette erreur dans la console : Uncaught TypeError: Cannot read property 'files' of undefined . Je ne comprends pas comment toutes les parties du plugin fonctionnent, ce qui rend le débogage difficile.

Code

Le javascript dans la page de démonstration :

$(function () {
'use strict';
// Change this to the location of your server-side upload handler:
var url = 'file_upload/server/php/UploadHandler.php',
    uploadButton = $('<button/>')
        .addClass('btn')
        .prop('disabled', true)
        .text('Processing...')
        .on('click', function () {
            var $this = $(this),
                data = $this.data();
            $this
                .off('click')
                .text('Abort')
                .on('click', function () {
                    $this.remove();
                    data.abort();
                });
            data.submit().always(function () {
                $this.remove();
            });
        });
$('#fileupload').fileupload({
    url: url,
    dataType: 'json',
    autoUpload: false,
    acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
    maxFileSize: 5000000, // 5 MB
    // Enable image resizing, except for Android and Opera,
    // which actually support image resizing, but fail to
    // send Blob objects via XHR requests:
    disableImageResize: /Android(?!.*Chrome)|Opera/
        .test(window.navigator.userAgent),
    previewMaxWidth: 100,
    previewMaxHeight: 100,
    previewCrop: true
}).on('fileuploadadd', function (e, data) {
    data.context = $('<div/>').appendTo('#files');
    $.each(data.files, function (index, file) {
        var node = $('<p/>')
                .append($('<span/>').text(file.name));
        if (!index) {
            node
                .append('<br>')
                .append(uploadButton.clone(true).data(data));
        }
        node.appendTo(data.context);
    });
}).on('fileuploadprocessalways', function (e, data) {
    var index = data.index,
        file = data.files[index],
        node = $(data.context.children()[index]);
    if (file.preview) {
        node
            .prepend('<br>')
            .prepend(file.preview);
    }
    if (file.error) {
        node
            .append('<br>')
            .append(file.error);
    }
    if (index + 1 === data.files.length) {
        data.context.find('button')
            .text('Upload')
            .prop('disabled', !!data.files.error);
    }
}).on('fileuploadprogressall', function (e, data) {
    var progress = parseInt(data.loaded / data.total * 100, 10);
    $('#progress .bar').css(
        'width',
        progress + '%'
    );
}).on('fileuploaddone', function (e, data) {
    $.each(data.result.files, function (index, file) {
        var link = $('<a>')
            .attr('target', '_blank')
            .prop('href', file.url);
        $(data.context.children()[index])
            .wrap(link);
    });
}).on('fileuploadfail', function (e, data) {
    $.each(data.result.files, function (index, file) {
        var error = $('<span/>').text(file.error);
        $(data.context.children()[index])
            .append('<br>')
            .append(error);
    });
}).prop('disabled', !$.support.fileInput)
    .parent().addClass($.support.fileInput ? undefined : 'disabled');
});

Je suis surpris par le manque de documentation, il semble que cela devrait être une chose simple à changer. J'apprécierais vraiment que quelqu'un puisse m'expliquer comment faire.

74voto

Subrat Pattnaik Points 311

Je recherchais une fonctionnalité similaire il y a quelques jours et je suis tombé sur un bon tutoriel sur tutorialzine. Voici un exemple fonctionnel. Le tutoriel complet peut être trouvé ici .

Formulaire simple pour contenir le dialogue de téléchargement de fichiers :

<form id="upload" method="post" action="upload.php" enctype="multipart/form-data">
  <input type="file" name="uploadctl" multiple />
  <ul id="fileList">
    <!-- The file list will be shown here -->
  </ul>
</form>

Et voici le code jQuery pour télécharger les fichiers :

$('#upload').fileupload({

  // This function is called when a file is added to the queue
  add: function (e, data) {
    //This area will contain file list and progress information.
    var tpl = $('<li class="working">'+
                '<input type="text" value="0" data-width="48" data-height="48" data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" />'+
                '<p></p><span></span></li>' );

    // Append the file name and file size
    tpl.find('p').text(data.files[0].name)
                 .append('<i>' + formatFileSize(data.files[0].size) + '</i>');

    // Add the HTML to the UL element
    data.context = tpl.appendTo(ul);

    // Initialize the knob plugin. This part can be ignored, if you are showing progress in some other way.
    tpl.find('input').knob();

    // Listen for clicks on the cancel icon
    tpl.find('span').click(function(){
      if(tpl.hasClass('working')){
              jqXHR.abort();
      }
      tpl.fadeOut(function(){
              tpl.remove();
      });
    });

    // Automatically upload the file once it is added to the queue
    var jqXHR = data.submit();
  },
  progress: function(e, data){

        // Calculate the completion percentage of the upload
        var progress = parseInt(data.loaded / data.total * 100, 10);

        // Update the hidden input field and trigger a change
        // so that the jQuery knob plugin knows to update the dial
        data.context.find('input').val(progress).change();

        if(progress == 100){
            data.context.removeClass('working');
        }
    }
});
//Helper function for calculation of progress
function formatFileSize(bytes) {
    if (typeof bytes !== 'number') {
        return '';
    }

    if (bytes >= 1000000000) {
        return (bytes / 1000000000).toFixed(2) + ' GB';
    }

    if (bytes >= 1000000) {
        return (bytes / 1000000).toFixed(2) + ' MB';
    }
    return (bytes / 1000).toFixed(2) + ' KB';
}

Et voici l'exemple de code PHP pour traiter les données :

if($_POST) {
    $allowed = array('jpg, jpeg');

    if(isset($_FILES['uploadctl']) && $_FILES['uploadctl']['error'] == 0){

        $extension = pathinfo($_FILES['uploadctl']['name'], PATHINFO_EXTENSION);

        if(!in_array(strtolower($extension), $allowed)){
            echo '{"status":"error"}';
            exit;
        }

        if(move_uploaded_file($_FILES['uploadctl']['tmp_name'], "/yourpath/." . $extension)){
            echo '{"status":"success"}';
            exit;
        }
        echo '{"status":"error"}';
    }
    exit();
}

Le code ci-dessus peut être ajouté à tout formulaire existant. Ce programme télécharge automatiquement les images, une fois qu'elles sont ajoutées. Cette fonctionnalité peut être modifiée et vous pouvez soumettre l'image, pendant que vous soumettez votre formulaire existant.

J'ai mis à jour ma réponse avec le code réel. Tous les crédits à l'auteur original du code.

Source : http://tutorialzine.com/2013/05/mini-ajax-file-upload-form/

4voto

Louis Ferreira Points 31

J'ai aussi eu du mal avec cela mais j'ai réussi à le faire fonctionner une fois que j'ai compris comment les chemins fonctionnent dans UploadHandler.php : upload_dir et upload_url sont à peu près les seuls paramètres à regarder pour que cela fonctionne. Vérifiez également les journaux d'erreurs de votre serveur pour obtenir des informations de débogage.

1voto

engineerDave Points 1964

J'ai lutté avec ce plugin pendant un certain temps sur Rails, puis quelqu'un l'a gemifié, rendant obsolète tout le code que j'avais créé.

Bien qu'il semble que vous ne l'utilisiez pas dans Rails, si quelqu'un l'utilise, vérifiez ceci pierre précieuse . La source est ici --> jQueryFileUpload Rails .

Mise à jour :

Afin de satisfaire le commentateur, j'ai mis à jour ma réponse. Essentiellement, " utiliser ce joyau , voici le code source " S'il disparaît, faites-le à la manière longue.

0voto

CORSAIR Points 59

Vous pouvez utiliser uploadify c'est le meilleur plugin jquery multiupload que j'ai utilisé.

La mise en œuvre est facile, le support du navigateur est parfait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X