2010-09-16 13 views
5

Estoy intentando crear un archivo Node.js que suba con una barra de progreso AJAX.Node.js Creador de archivos 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'); 

El jQuery es bastante largo, así que he cortarlo, pero lo único que hace es iniciar un temporizador y solicitar datos de actualización y ajuste en la etiqueta.

Con este código no aceptará múltiples cargas de diferentes hosts? También parece que Firefox no funciona pero Safari/Chrome ¿tiene alguna idea? ¿Cómo solicitaría un estado para la carga del archivo?

Gracias, Alex

+0

No puedo responder a esto, pero asegúrese de detenerse en [# node.js] (http://webchat.freenode.net/?channels=node.js&uio=d4) y hacer preguntas! – DTrejo

+0

¿Has resuelto esto? –

+0

lamentablemente no, se acabó el tiempo libre ... esto podría ayudar a https://github.com/felixge/node-formidable o echa un vistazo a las publicaciones de blog depurables de felixge que cubre muchos de estos problemas. – Alex

Respuesta

1

Una cosa que necesita es una manera de identificar de forma única una carga en particular. El formulario debe incluir una identificación única como un campo oculto que identifica la carga. Luego, al realizar la carga, puede mantener un mapa de ID -> nivel de progreso y la llamada de "actualización" pasará esa identificación para asegurarse de que está mirando el indicador de progreso correcto.

Lo que puede encontrar, sin embargo, es que los navegadores solo permiten un número limitado de conexiones al servidor. Por lo tanto, su solicitud de una actualización de progreso puede esperar a que finalice la carga real incluso antes de que se envíe al servidor.

Para evitarlo, puede necesitar usar socket.io para abrir una conexión al servidor que permanece abierto antes de iniciar la carga, y recibir actualizaciones sobre esa conexión a medida que la carga progresa.

0

Para Sólo responde la pregunta thrid

¿Cómo puedo solicitar un estado para la carga de archivos?

Formidable tiene un evento "progess":

Event: 'progress' (bytesReceived, bytesExpected) 

Con esto, usted puede fácilmente hacer un seguimiento de su progreso y devolverlo en su actualización de guardia preparado.

Así que solo consulta con tu ajax en tu llamada de actualización con, por ejemplo, una ID de sesión u otro identificador único que ambos lados conocen.