更新:我或多或少使用多部分(these instructions来自file uploading directive)来解决问题,但仍然不知道为什么原始代码(如下)失败
这个问题有很多变化,我在那里尝试了一些没有成功的想法。我正在使用{{3}}(并且已经尝试过另一个开源替代方案)将二进制文件发送到节点服务器,该服务器运行以下代码(基于我现在无法解释的SO答案):< / p>
app.use(multipart({uploadDir: __dirname + '/../uploads'}))
如果我上传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
进行比较,则它们具有相同的Kb数据,但不相同,后续代码无法处理该文件。鉴于这发生在两段第三方代码中,我怀疑问题在于我的代码。
以下是正在进行POST的客户端的详细信息
答案 0 :(得分:3)
最后,当我意识到我想避免保存到磁盘时,我使用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);
};
答案 1 :(得分:1)
更新:客户帖子详情有帮助。您没有发布您正在发布表单流的文件流(可能有效)。好消息是有很好的模块来处理表单流。
您需要将请求流传递到表单处理流(例如busboy),它将处理------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);
};