jQuery de Progression de Téléchargement et upload de fichier en AJAX

il semble que je n'ai pas clairement communiqué mon problème. J'ai besoin d'envoyer un fichier (en utilisant AJAX) et j'ai besoin d'obtenir la progression de téléchargement du fichier en utilisant le Nginx HttpUploadProgressModule . J'ai besoin d'une bonne solution à ce problème. J'ai essayé avec le jquery.uploadprogress plugin, mais je me retrouve à devoir réécrire une grande partie de celui-ci pour le faire fonctionner dans tous les navigateurs et pour envoyer le fichier en utilisant AJAX.

Tout ce dont j'ai besoin c'est du code cela et il doit fonctionner dans tous les principaux navigateurs (Chrome, Safari, FireFox, et IE). Il serait encore mieux Si je pouvais trouver une solution qui permettra de gérer plusieurs téléchargements de fichiers.

j'utilise le jquery .uploadprogress plugin pour obtenir la progression de téléchargement d'un fichier à partir du NginxHttpUploadProgressModule. C'est dans une iframe pour une application facebook. Il fonctionne dans firefox, mais il échoue dans chrome/safari.

Quand j'ouvre la console, j'obtiens cette.

Uncaught ReferenceError: progressFrame is not defined
jquery.uploadprogress.js:80

vous savez comment je réparerais ça?

je voudrais aussi envoyer le fichier en utilisant AJAX quand il est terminé. Comment pourrais-je mettre ça en œuvre?

EDIT:

J'ai besoin de cela bientôt et c'est important, donc je vais mettre une prime de 100 points sur cette question. La première personne à y répondre recevra les 100 points.

EDIT 2:

Jake33 m'a aidé à résoudre le premier problème. La première personne à laisser une réponse à comment envoyer le fichier avec l'ajax trop recevrez 100 points.

68
demandé sur Conceited Code 2011-02-01 01:36:11

2 réponses

télécharger des fichiers est en fait possible avec AJAX ces jours-ci. Oui, AJAX, pas des connards D'AJAX comme swf ou java.

cet exemple pourrait vous aider: https://webblocks.nl/tests/ajax/file-drag-drop.html

(il inclut également l'interface glisser/déposer, mais qui est facilement ignoré.)

au fond, ce qui se résume est ceci:

<input id="files" type="file" />

<script>
document.getElementById('files').addEventListener('change', function(e) {
    var file = this.files[0];
    var xhr = new XMLHttpRequest();
    (xhr.upload || xhr).addEventListener('progress', function(e) {
        var done = e.position || e.loaded
        var total = e.totalSize || e.total;
        console.log('xhr progress: ' + Math.round(done/total*100) + '%');
    });
    xhr.addEventListener('load', function(e) {
        console.log('xhr upload complete', e, this.responseText);
    });
    xhr.open('post', '/URL-HERE', true);
    xhr.send(file);
});
</script>

(démo: http://jsfiddle.net/rudiedirkx/jzxmro8r / )

donc fondamentalement ce qu'il se résume à est ceci =)

xhr.send(file);

file est le type de Blob : http://www.w3.org/TR/FileAPI /

une autre (meilleure IMO) façon est d'utiliser FormData . Cela vous permet 1) de nommer un fichier, comme dans un formulaire et 2) d'envoyer d'autres choses (fichiers aussi), comme dans un formulaire.

var fd = new FormData;
fd.append('photo1', file);
fd.append('photo2', file2);
fd.append('other_data', 'foo bar');
xhr.send(fd);

FormData rend le code serveur plus propre et plus compatible en amont (puisque la requête a maintenant le même format exact que les formes normales).

Tout cela n'est pas expérimental, mais très moderne. Chrome 8+ et Firefox 4+ savent quoi faire, mais je ne sais rien d'autre.

C'est ainsi que j'ai traité la requête (1 image par requête) en PHP:

if ( isset($_FILES['file']) ) {
    $filename = basename($_FILES['file']['name']);
    $error = true;

    // Only upload if on my home win dev machine
    if ( isset($_SERVER['WINDIR']) ) {
        $path = 'uploads/'.$filename;
        $error = !move_uploaded_file($_FILES['file']['tmp_name'], $path);
    }

    $rsp = array(
        'error' => $error, // Used in JS
        'filename' => $filename,
        'filepath' => '/tests/uploads/' . $filename, // Web accessible
    );
    echo json_encode($rsp);
    exit;
}
199
répondu Rudie 2018-03-10 22:14:33

voici quelques options pour utiliser AJAX pour télécharger des fichiers:

mise à jour: voici un plug-in JQuery pour téléchargement de plusieurs fichiers .

15
répondu jmort253 2017-05-23 11:55:04