Ответ 1
Я бы использовал оба метода, которые вы обсуждали: проверьте заголовок content-legnth
и посмотрите поток данных, чтобы убедиться, что он не превышает ваш лимит.
Чтобы сделать это, я сначала сделаю запрос HEAD
к URL-адресу, чтобы узнать, доступен ли заголовок content-length
. Если он больше вашего предела, вы можете остановиться прямо там. Если он не существует или он меньше вашего предела, сделайте фактический запрос GET
. Поскольку запрос HEAD
будет возвращать заголовки и фактический контент, это поможет быстро избавиться от больших файлов с действующим content-length
.
Затем сделайте фактический запрос GET
и посмотрите размер входящих данных, чтобы убедиться, что он не превышает ваш лимит (это можно сделать с помощью модуля запроса, см. ниже). Вы захотите сделать это независимо от того, нашел ли запрос HEAD
заголовок content-length
, как проверку работоспособности (сервер может лежать о content-length
).
Что-то вроде этого:
var maxSize = 10485760;
request({
url: url,
method: "HEAD"
}, function(err, headRes) {
var size = headRes.headers['content-length'];
if (size > maxSize) {
console.log('Resource size exceeds limit (' + size + ')');
} else {
var file = fs.createWriteStream(filename),
size = 0;
var res = request({ url: url });
res.on('data', function(data) {
size += data.length;
if (size > maxSize) {
console.log('Resource stream exceeded limit (' + size + ')');
res.abort(); // Abort the response (close and cleanup the stream)
fs.unlink(filename); // Delete the file we were downloading the data to
}
}).pipe(file);
}
});
Трюк для наблюдения за размером входящих данных с помощью модуля запроса заключается в привязке к событию data
в ответе (например, вы думали о том, как это сделать с использованием модуля http
), прежде чем вы начнете связывать его с файловым потоком, Если размер данных превышает максимальный размер файла, вызовите метод ответа abort()
.