Node.js - Громадная загрузка с XHR - PullRequest
9 голосов
/ 30 июля 2011

Я пытаюсь реализовать простую загрузку XHR в Node.js (через Грозный ). Проблема в том, что если я установлю

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

узел выдаёт мне ошибку:

Error: bad content-type header, no multipart boundary

Если я установлю границу на случайную строку, ничего не произойдет. Браузер просто зависает на POST и ждет ответа сервера.

Дело в том, что если я использую грозный с обычным синхронным POST, все работает отлично.

Кто-нибудь пытался использовать Грозный с загрузкой XHR?

Ответы [ 2 ]

13 голосов
/ 31 июля 2011

Я понял это. Я сделал небольшую ошибку на стороне клиента.

Вот рабочий пример загрузки XHR с Грозным

Вам не нужно для установки границ или специальных заголовков.

Клиент

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

Сервер

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);
    }
  });
});
2 голосов
/ 30 июля 2011

Я попробовал несколько разных вещей с Formidable и так и не смог заставить его принять XHR-загрузку.Вот что я закончил делать для загрузки файла с помощью экспресс.

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...