nodejs读写大文件
内存限制
大文件读写操作,由于内存限制问题,不要直接使用fs.readFile 和 fs.writeFile。
必须使用fs.ReadStream 和 fs.WriteStream 来对文件进行读写操作。
fs.ReadStream:上传大文件
var urlparse = require('url').parse
, http = require('http')
, fs = require('fs');
function upload(url, uploadfile, callback) {
var urlinfo = urlparse(url);
var options = {
method: 'POST',
host: urlinfo.host,
path: urlinfo.pathname
};
if(urlinfo.port) {
options.port = urlinfo.port;
}
if(urlinfo.search) {
options.path += urlinfo.search;
}
var req = http.request(options, function(res) {
var chunks = [], length = 0;
res.on('data', function(chunk) {
length += chunk.length;
chunks.push(chunk);
});
res.on('end', function() {
var buffer = new Buffer(length);
// delay copy
for(var i = 0, pos = 0, size = chunks.length; i < size; i++) {
chunks[i].copy(buffer, pos);
pos += chunks[i].length;
}
res.body = buffer;
callback(null, res);
});
});
var readstream = fs.createReadStream(uploadfile);
readstream.on('data', function(chunk) {
console.log('write', chunk.length);
req.write(chunk);
});
readstream.on('end', function() {
req.end();
});
};
upload('http://weibo.com/', '/tmp/bigfile.pdf', function(err, res) {
console.log(res.statusCode, res.headers);
});
fs.WriteStream:下载大文件
var urlparse = require('url').parse
, http = require('http')
, fs = require('fs');
function download(url, savefile, callback) {
console.log('download', url, 'to', savefile)
var urlinfo = urlparse(url);
var options = {
method: 'GET',
host: urlinfo.host,
path: urlinfo.pathname
};
if(urlinfo.port) {
options.port = urlinfo.port;
}
if(urlinfo.search) {
options.path += urlinfo.search;
}
var req = http.request(options, function(res) {
var writestream = fs.createWriteStream(savefile);
writestream.on('close', function() {
callback(null, res);
});
res.pipe(writestream);
});
req.end();
};
download('http://weibo.com/', '/tmp/downfile.html', function(err, res) {
console.log(res.statusCode, res.headers);
});
有爱
本文示例中为了凸显文件操作部分,异常处理部分代码已去除,请读者自行补全。
^_^ 希望本文对你有用