2011-07-30 32 views
9

Intento implementar una carga XHR sencilla en Node.js (a través de Formidable). El problema es que si fijoNode.js: carga formidable con XHR

xhr.setRequestHeader("Content-Type", "multipart/form-data"); 

nodo me da error:

Error: bad content-type header, no multipart boundary 

Si fijo límite a sólo una cadena aleatoria no pasa nada. El navegador simplemente cuelga en POST y espera la respuesta del servidor.

El punto es que si uso formidable con POST síncrono normal todo funciona bien.

¿Alguien intentó usar Formidable con carga XHR?

Respuesta

13

Me di cuenta. Hice un pequeño error en el lado del cliente.

Aquí es el expample de trabajo de carga XHR con Formidable

Usted no necesita para establecer fronteras o cabeceras especiales.

cliente

var formData = new FormData(); 
var xhr = new XMLHttpRequest(); 

var onProgress = function(e) { 
    if (e.lengthComputable) { 
    var percentComplete = (e.loaded/e.total)*100; 
    } 
}; 

var onReady = function(e) { 
// ready state 
}; 

var onError = function(err) { 
    // something went wrong with upload 
}; 

formData.append('files', file); 
xhr.open('post', '/up', true); 
xhr.addEventListener('error', onError, false); 
xhr.addEventListener('progress', onProgress, false); 
xhr.send(formData); 
xhr.addEventListener('readystatechange', onReady, false); 

servidor

app.post('/up', function(req, res) { 
    var form = new formidable.IncomingForm(); 
    form.uploadDir = __dirname + '/tmp'; 
    form.encoding = 'binary'; 

    form.addListener('file', function(name, file) { 
    // do something with uploaded file 
    }); 

    form.addListener('end', function() { 
    res.end(); 
    }); 

    form.parse(req, function(err, fields, files) { 
    if (err) { 
     console.log(err); 
    } 
    }); 
}); 
+0

Recibo el error "encabezado de tipo de contenido incorrecto, sin tipo de contenido". ¿No estoy seguro de cómo evitar esto? – wilsonpage

+0

@pagewil Pruebe a establecer enctype = "multipart/form-data" en su

etiqueta – Pono

+0

¿Podría compartir lo que en realidad era el problema del lado del cliente, que lo solucionó? – Alexander

2

Probé un par de cosas diferentes con Formidable y nunca pude conseguir que aceptara una carga XHR. Esto es lo que terminé haciendo para cargar un archivo usando express.

app.post('/upload', function (req,res){ 
    if(req.xhr){ 
    var fSize = req.header('x-file-size'), 
    fType = req.header('x-file-type'), 
    basename = require('path').basename, 
    fName = basename(req.header('x-file-name')), 
    ws = fs.createWriteStream('./temp/'+fName); 
    req.on('data', function(data) { 
     ws.write(data); 
    }); 

Espero que esto ayude.

+1

soy capaz de conseguir que se acepte una carga XHR usando formidable. – Tareq

Cuestiones relacionadas