Я хочу загрузить файл с помощью библиотеки Request. Это довольно просто:
request({
url: url-to-file
}).pipe(fs.createWriteStream(file));
Поскольку URL-адрес предоставляется пользователями (в моем случае), я хотел бы ограничить максимальный размер файла, которое загрузит мое приложение - пусть говорят 10 МБ. Я мог бы полагаться на заголовки content-length
следующим образом:
request({
url: url-to-file
}, function (err, res, body) {
var size = parseInt(res.headers['content-length'], 10);
if (size > 10485760) {
// ooops - file size too large
}
}).pipe(fs.createWriteStream(file));
Вопрос в том, насколько это надежным? Думаю, этот обратный вызов будет вызван после того, как файл будет загружен, верно? Но это слишком поздно, если кто-то поставляет URL-адрес файла размером 1 ГБ. Мое приложение сначала загрузит этот 1 ГБ файла, чтобы проверить (в обратном вызове), что он слишком большой.
Я тоже думал о добром старом Node http.get()
методе. В этом случае я бы сделал следующее:
var opts = {
host: host,
port: port,
path: path
};
var file = fs.createWriteStream(fileName),
fileLength = 0;
http.get(opts, function (res) {
res.on('data', function (chunk) {
fileLength += chunk.length;
if (fileLength > 10485760) { // ooops - file size too large
file.end();
return res.end();
}
file.write(chunk);
}).on('end', function () {
file.end();
});
});
Какой подход вы бы рекомендовали ограничить максимальный размер файла загрузки, не загрузив всю вещь и не проверив ее размер?