使用带有formData文件上传的Node Buffer或fileStream

时间:2014-12-28 20:22:07

标签: angularjs node.js fs

更新:我或多或少使用多部分(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的客户端的详细信息 Network settings

2 个答案:

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