使用node.js下载大文件,避免占用大量内存

我正在尝试创建一个文件下载程序作为后台服务,但是当计划了一个大文件时,首先将其放入内存中,然后在下载结束时将文件写入磁盘。

考虑到我可能同时下载许多文件,如何使文件逐渐写入磁盘保留内存?

这是我使用的代码:

var sys = require("sys"),

http = require("http"),

url = require("url"),

path = require("path"),

fs = require("fs"),

events = require("events");

var downloadfile = "http://nodejs.org/dist/node-v0.2.6.tar.gz";

var host = url.parse(downloadfile).hostname

var filename = url.parse(downloadfile).pathname.split("/").pop()

var theurl = http.createClient(80, host);

var requestUrl = downloadfile;

sys.puts("Downloading file: " + filename);

sys.puts("Before download request");

var request = theurl.request('GET', requestUrl, {"host": host});

request.end();

var dlprogress = 0;

setInterval(function () {

sys.puts("Download progress: " + dlprogress + " bytes");

}, 1000);

request.addListener('response', function (response) {

response.setEncoding('binary')

sys.puts("File size: " + response.headers['content-length'] + " bytes.")

var body = '';

response.addListener('data', function (chunk) {

dlprogress += chunk.length;

body += chunk;

});

response.addListener("end", function() {

fs.writeFileSync(filename, body, 'binary');

sys.puts("After download finished");

});

});

回答:

我将回调更改为:

request.addListener('response', function (response) {

var downloadfile = fs.createWriteStream(filename, {'flags': 'a'});

sys.puts("File size " + filename + ": " + response.headers['content-length'] + " bytes.");

response.addListener('data', function (chunk) {

dlprogress += chunk.length;

downloadfile.write(chunk, encoding='binary');

});

response.addListener("end", function() {

downloadfile.end();

sys.puts("Finished downloading " + filename);

});

});

这工作得很好。

以上是 使用node.js下载大文件,避免占用大量内存 的全部内容, 来源链接: utcz.com/qa/428445.html

回到顶部