3038 votes

Comment puis-je télécharger des fichiers de manière asynchrone avec jQuery?

Je voudrais télécharger un fichier en mode asynchrone avec jQuery. C'est mon code HTML:

<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>

Et voici mon code JavaScript:

$(document).ready(function () {
    $("#uploadbutton").click(function () {
        var filename = $("#file").val();

        $.ajax({
            type: "POST",
            url: "addFile.do",
            enctype: 'multipart/form-data',
            data: {
                file: filename
            },
            success: function () {
                alert("Data Uploaded: ");
            }
        });
    });
});

Au lieu du fichier en cours de téléchargement, je ne suis qu'à obtenir le nom de fichier. Que puis-je faire pour résoudre ce problème?

Solution Actuelle

J'utilise le jQuery Forme de Plugin de téléchargement de fichiers.

2574voto

olanod Points 12081

Avec HTML5 , vous POUVEZ faire des uploads de fichier avec l'Ajax et jQuery. Non seulement cela, vous pouvez faire de validation de fichier (le nom, la taille, et le MIME-type) ou la poignée de l'événement progress avec le HTML5 progrès de la balise (ou un div). Récemment, j'ai eu à faire un fichier uploader, mais je ne voulais pas utiliser de Flash , ni des Images ou des plugins et après quelques recherches j'ai trouvé la solution.

Le code HTML:

<form enctype="multipart/form-data">
    <input name="file" type="file" />
    <input type="button" value="Upload" />
</form>
<progress></progress>

Tout d'abord, vous pouvez faire la validation de certains si vous voulez. Par exemple, dans l'événement onChange du fichier:

$(':file').change(function(){
    var file = this.files[0];
    var name = file.name;
    var size = file.size;
    var type = file.type;
    //Your validation
});

Maintenant, l'Ajax soumettre avec le click du bouton:

$(':button').click(function(){
    var formData = new FormData($('form')[0]);
    $.ajax({
        url: 'upload.php',  //Server script to process data
        type: 'POST',
        xhr: function() {  // Custom XMLHttpRequest
            var myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // Check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // For handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell jQuery not to process data or worry about content-type.
        cache: false,
        contentType: false,
        processData: false
    });
});

Maintenant, si vous souhaitez gérer le progrès.

function progressHandlingFunction(e){
    if(e.lengthComputable){
        $('progress').attr({value:e.loaded,max:e.total});
    }
}

Comme vous pouvez le voir, avec HTML5 (et quelques recherches) téléchargement du fichier ne sera pas seulement possible, mais super facile. Essayez avec Google Chrome comme certains des composants HTML5 les exemples ne sont pas disponibles dans tous les navigateurs.

339voto

Cheery Points 6696

Il existe différents prêts plugins sur upload de fichier sur jQuery.

Faire ce genre de télécharger des hacks n'est pas une expérience agréable, de sorte que les gens aiment utiliser les solutions prêtes à l'emploi.

Voici quelques-uns:

Vous pouvez rechercher plus de jQuery plugin du site.

292voto

Oli Points 65050

Vous ne pouvez pratiquement faire de l'Ajax upload de fichiers si vous avez besoin d'une large prise en charge du navigateur.

Le nouveau fichier API n'est pas pris en charge dans internet explorer avant la version 10 , donc selon l'endroit où vous tirez vos stats et votre naturel démographique, vous êtes à la recherche à 5-20% de vos utilisateurs. Pour plus sain d'esprit des développeurs c'est inabordable perte.

Toutefois, si vous créez un iframe sur la page (que vous pouvez cacher avec CSS), vous pouvez cibler votre formulaire de post pour que l'iframe. La page principale n'a pas besoin de se déplacer.

Parce que c'est un vrai post, il n'est pas entièrement interactifs de sorte que vous devez regarder en demandant la progression du téléchargement en cours à partir de votre serveur. Cela varie massivement en fonction de votre serveur. ASP.NET a plus agréable mécanismes. PHP plain échoue, mais vous pouvez utiliser Perl ou Apache modifications de la contourner.

Si vous avez besoin de plusieurs fichiers uploads, il est préférable de faire un fichier à la fois (à surmonter maximale de téléchargement de fichiers des limites). Post la première forme de l'iframe, suivi de ses progrès à l'aide de la et quand il a fini, après la deuxième forme de l'iframe, et ainsi de suite.

Ou utiliser un Java/Flash solution. Ils sont beaucoup plus flexibles en ce qu'ils peuvent faire avec leurs messages...

86voto

Jordan Feldstein Points 3286

Cette AJAX upload de fichier plugin jQuery télécharge le fichier quelque part, et passe le réponse à un rappel, rien d'autre.

  • Il ne dépend pas de code HTML spécifique, juste lui donner un <input type="file">
  • Il n'a pas besoin de votre serveur à répondre d'une manière particulière
  • Il n'a pas d'importance combien de fichiers que vous utilisez, ou si elles sont sur la page

-- Utiliser aussi peu que --

$('#one-specific-file').ajaxfileupload({
  'action': '/upload.php'
});

-- ou --

$('input[type="file"]').ajaxfileupload({
  'action': '/upload.php',
  'params': {
    'extra': 'info'
  },
  'onComplete': function(response) {
    console.log('custom handler for file:');
    alert(JSON.stringify(response));
  },
  'onStart': function() {
    if(weWantedTo) return false; // cancels upload
  },
  'onCancel': function() {
    console.log('no file selected');
  }
});

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