10 Stimmen

Node.js - Formidable Upload mit XHR

Ich versuche, einen einfachen XHR-Upload zu Node.js zu implementieren (über Beeindruckend ). Das Problem ist, dass ich, wenn ich die

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

Knoten gibt mir einen Fehler:

Error: bad content-type header, no multipart boundary

Wenn ich die Grenze auf eine zufällige Zeichenfolge setze, passiert nichts. Der Browser bleibt einfach bei POST hängen und wartet auf die Serverantwort.

Der Punkt ist, dass, wenn ich formidable mit regelmäßigen synchronen POST verwenden alles funktioniert gut.

Hat jemand versucht, die Beeindruckend mit XHR-Upload?

14voto

Pono Punkte 10412

Ich habe es herausgefunden. Ich habe einen kleinen Fehler auf der Client-Seite gemacht.

Hier ist die Arbeitsbeispiel für XHR-Upload mit Formidable

Sie brauchen nicht um Grenzen oder besondere Kopfzeilen festzulegen.

Kunde

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

Server

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

2voto

scottmizo Punkte 146

Ich habe ein paar verschiedene Dinge mit Formidable ausprobiert und konnte nie erreichen, dass es einen XHR-Upload akzeptiert. Hier ist, was ich am Ende für einen Dateiupload mit Express tun.

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

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X