Node.js – Téléchargement formidable avec XHR

J’essaie d’implémenter un simple téléchargement XHR sur Node.js (via Formidable ). Le problème est que si je mets

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

noeud me donne une erreur:

 Error: bad content-type header, no multipart boundary 

Si je mets une limite à une chaîne aléatoire, rien ne se passe. Le navigateur se bloque sur le POST et attend la réponse du serveur.

Le fait est que si j’utilise formidable avec un POST synchrone normal, tout fonctionne correctement.

Quelqu’un a essayé d’utiliser Formidable avec le téléchargement XHR?

Je l’ai compris. J’ai fait un petit bug du côté client.

Voici l’exemple de travail du téléchargement XHR avec Formidable

Vous n’avez pas besoin de définir des limites ou des en-têtes spéciaux.

Client

 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); 

Serveur

 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); } }); }); 

J’ai essayé différentes choses avec Formidable et je n’ai jamais réussi à le faire accepter un téléchargement XHR. Voici ce que j’ai fini par faire pour un téléchargement de fichier en utilisant 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); }); 

J’espère que cela t’aides.