将大文本文件流传输到服务器nodejs

时间:2014-03-01 00:13:16

标签: node.js mongodb

我有一个nodejs客户端将大约200k的文本文件流式传输到服务器nodejs应用程序,该应用程序将信息保存在mongodb表中。

它适用于小文件,但是使用大文本文件时,服务器会多次从...中收到数据'流式传输一个唯一文件,就好像服务器将文件分成几块并打开170k一样文件流,mongodb中的3个条目,当我只想要一个。

感谢您的帮助

这是服务器:

var net = require('net'),
    fs = require('fs'),
    buffer = require('buffer');

var server = net.createServer(function(conn) {
    console.log('server connected');

});

var HOST = '127.0.0.1';
var PORT = '9001';

// DB Config
var databaseUrl = "logserver";
var collections = ["logs"]
var db = require("mongojs").connect(databaseUrl, collections);


server.listen(PORT, HOST, function() {
    //listening
    console.log('Listening on port ' + PORT + '\n');

    server.on('connection', function(conn) {
        var current_time = Date.now();

        console.log('connection made...\n')
        conn.on('data', function(data) {
            console.log('data received from ' + conn.remoteAddress);
            db.logs.save({log_timestamp: current_time, client_ip: conn.remoteAddress, log_data: data.toString('utf8')}, function(err, saved) {
                if( err || !saved ) console.log("- Log not saved -");
                else console.log("- Log saved -");
            });
        });
    })
});

这是客户:

var net = require('net');
var fs = require('fs');


var PORT = 9001;
var HOST = '127.0.0.1';
var FILEPATH = 'file.txt';

var client = new net.Socket()

//connect to the server
client.connect(PORT,HOST,function() {
    'Client Connected to server'

    //send a file to the server
    var fileStream = fs.createReadStream(FILEPATH);
    fileStream.on('error', function(err){
        console.log(err);
    })

    fileStream.on('open',function() {
        console.log('Sending log file...');
        fileStream.pipe(client);
    });

});

//handle closed
client.on('close', function() {
    console.log('Connection finished')
});

client.on('error', function(err) {
    console.log(err);
});

1 个答案:

答案 0 :(得分:2)

由于TCP的工作方式,文件被分成块,因此您无法完全阻止它。您可以做的是重新组装另一侧的文件。这是一个简单的方法:

var chunks = [];
conn.on('data', function(chunk) {
    chunks.push(chunk);
});
conn.on('end', function() {
    var data = Buffer.concat(chunks);
    db.logs.save(...);
});