2014-12-28 2 views
1

Update: Я более или менее решить эту проблему с помощью многочастному (app.use(multipart({uploadDir: __dirname + '/../uploads'})) из these instructions), но до сих пор не знаю, почему мой исходный код (ниже) не выполняется.Использование узла Buffer или FileStream с FormData файл загрузить

В этом вопросе было множество вариантов, и я пробовал идеи там без успеха. Я использую file uploading directive (и с тех пор пытаюсь использовать другую альтернативу с открытым исходным кодом) для отправки двоичного файла на сервер узла, который запускает следующий код (на основе ответа SO, который я не могу сейчас переделать):

exports.receive = function(req, res) { 

    var fitFileBuffer = new Buffer(''); 
    // req.setEncoding("binary"); //doesn't help 

    req.on('data', function(chunk) { 
     fitFileBuffer = Buffer.concat([fitFileBuffer, chunk]); 
    }); 

    req.on('end', function() { 
     fs.writeFileSync(
      "today2.fit", 
      fitFileBuffer, 
      'binary'); 
     res.send(200); 
    }); 
}; 

Если я загружаю today.fit и сравниваю с today2.fit, они имеют один и тот же Кбайт данных, но не идентичны, а последующий код не обрабатывает файл. Учитывая, что это происходит с двумя частями стороннего кода, я подозреваю, что проблема связана с моим кодом.

Вот детали от клиентской части POST делается Network settings

ответ

1

UPDATE: клиентские почтовые детали помогли. Вы не отправляете поток файлов (который работал бы), вы отправляете поток формы. Хорошей новостью является наличие хороших модулей для обработки потоков форм.

Вы должны будете трубы поток запроса в поток обработки формы (например, помощник официанта), который будет обрабатывать ------WebKitFormBoundary. . . часть и они дают вам файл (ы) в виде потока (ов)

https://github.com/mscdex/busboy

var Busboy = require('busboy'); 

exports.receive = function(req, res, next) { 
    var busboy = new Busboy({ headers: req.headers }); 
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
     var fileWriteStream = fs.createWriteStream('today2.fit'); 
     file.pipe(fileWriteStream); 
    }); 
    busbody.on('finish', function() { 
     res.send(201); 
    }); 
    req.pipe(busboy); 
}; 
+0

Мне нужно было изменить это на 'req.pipe (fileWriteStream)', чтобы избежать ошибки во время выполнения, но я закончил с тем, что выглядит таким же «today2.fit», как и с моим исходным кодом. Когда я использовал отладчик узла, я обнаружил, что '' end'', похоже, не вызывался, хотя это и работало с моим исходным кодом. Есть еще идеи? –

+0

Спасибо, я имел это как 'ws' и пропустил этот, когда я реорганизовал. re: «конец», не стреляющий, ахх, один, я всегда забываю об этом. Исправленные потоки не испускают «конец», они испускают «финиш». Я обновил код. – generalhenry

+0

Спасибо, но это все еще не делает это для меня. См. Обновление в вопросе, поскольку я нашел решение, но основанное на добавлении промежуточного программного обеспечения unipart. Я все еще смущен –

2

в конце концов, когда я понял, что я хотел бы избежать сохранения на диск, поэтому я изменил код generalhenry с некоторым материалом с сайта busyboy и мое собственное использование буфера:

exports.receive = function (req, res, next) { 
    var busboy = new Busboy({ headers: req.headers }); 
    var fileBuffer = new Buffer(''); 

    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
     file.on('data', function(data) { 
      console.log('File [' + fieldname + '] got ' + data.length + ' bytes'); 
      fileBuffer = Buffer.concat([fileBuffer, data]); 
     }); 

     file.on('end', function() { 
      console.log('File [' + fieldname + '] Finished'); 
      genXmlFromString(fileBuffer.toString(), function(data) { 
       res.json(data); 
      }); 
     }); 

    }); 

    busboy.on('finish', function() { 
     console.log("'finish'"); 
    }); 

    req.pipe(busboy); 
}; 
Смежные вопросы