2010-09-16 3 views
5

J'essaie de créer un uploader de fichiers Node.js avec une barre de progression AJAX.Node.js Téléchargeur de fichiers AJAX

var formidable = require('./formidable'), http = require('http'), sys = require('sys'); 
http.createServer(function(req, res) { 
    if (req.url == '/upload' && req.method.toLowerCase() == 'post') { 
    // parse a file upload 
    var form = new formidable.IncomingForm(); 
    form.uploadDir = './node_uploads'; 
    form.keepExtensions = true; 
    //print the upload status in bytes 
    form.addListener("progress", function(bytesReceived, bytesExpected) { 
     //progress as percentage 
     progress = (bytesReceived/bytesExpected * 100).toFixed(2); 
     mb = (bytesExpected/1024/1024).toFixed(1); 
     sys.print("Uploading "+mb+"mb ("+progress+"%)\015"); 
    }); 
    //enter here after upload complete 
    form.parse(req, function(fields, files) { 
     sys.debug("Upload Complete"); 
     res.writeHead(200, {'content-type': 'text/plain'}); 
     res.write('received upload:\n\n'); 
     res.end()); 
    }); 
    return; 
    } 
    if (req.url == '/update') { 
     res.writeHead(200, {'content-type': 'text/plain'}); 
     res.write('<?xml version="1.0"?><response><status>1</status><message>'+ 000 +'</message> </response>'); 
     res.end(); 

    } 
    // show a file upload form 
    res.writeHead(200, {'content-type': 'text/html'}); 
    res.end 
    ('<form action="/upload" enctype="multipart/form-data" method="post">' 
    + '<p id="statuslabel"></p><p id="anotherlabel"></p>' 
    + '<input type="text" name="title" id="title"><br>' 
    + '<input type="file" name="upload" multiple="multiple"><br>' 
    + '<input type="submit" value="Upload" id="uploadform">' 
    + '</form>' 
    ); 
}).listen(8000, '127.0.0.1'); 

Le jQuery est assez longue pour que je l'ai coupé dehors mais tout ce qu'il fait est de commencer une donnée de minuterie et demande de mise à jour et mis sur l'étiquette.

Avec ce code, le nœud acceptera-t-il plusieurs téléchargements de différents hôtes? Aussi Firefox ne semble pas fonctionner mais Safari/Chrome a une idée? Comment demander un statut pour le téléchargement de fichier?

Merci, Alex

+0

Je ne peux pas répondre à cela, mais assurez-vous d'arrêter dans [# node.js] (http://webchat.freenode.net/?channels=node.js&uio=d4) et posez des questions! – DTrejo

+0

Avez-vous résolu ceci? –

+0

malheureusement pas, a manqué de temps libre .. cela peut aider https://github.com/felixge/node-formidable ou consultez les messages de blog débogables de felixge il couvre beaucoup de ces problèmes. – Alex

Répondre

1

Une chose que vous aurez besoin est un moyen d'identifier un téléchargement particulier. Le formulaire doit inclure un ID unique en tant que champ masqué identifiant le téléchargement. Ensuite, lorsque vous effectuez le téléchargement, vous pouvez conserver une carte d'ID -> niveau de progression et l'appel de "mise à jour" transmettra cet ID pour s'assurer qu'il regarde le bon indicateur de progression.

Ce que vous pouvez constater, cependant, c'est que les navigateurs n'autorisent qu'un nombre limité de connexions au serveur. Ainsi, votre demande de mise à jour de la progression peut attendre que le téléchargement proprement dit se termine avant même d'être envoyé au serveur. Pour contourner ce problème, vous devrez peut-être utiliser socket.io pour ouvrir une connexion au serveur restant ouvert avant le lancement du téléchargement et recevoir des mises à jour sur cette connexion au fur et à mesure de la progression du téléchargement.

0

Pour simplement Répondez à la question thrid

Comment pourrais-je demander un statut pour le téléchargement de fichiers?

Formidable a un événement « Progess »:

Event: 'progress' (bytesReceived, bytesExpected) 

Avec cela, vous pouvez facilement garder trace de vos progrès et revenir sur votre mise à jour appel préparé.

Il suffit donc d'interroger votre ajax sur votre appel de mise à jour avec par exemple un identifiant de session ou un autre identifiant unique des deux côtés.