Nuestro team redactor ha pasado mucho tiempo buscando para darle resolución a tus interrogantes, te regalamos la solución por esto esperamos serte de gran ayuda.
Solución:
De hecho, usaría los dos métodos que ha discutido: verifique el content-legnth
encabezado y observe el flujo de datos para asegurarse de que no exceda su límite.
Para hacer esto, primero haría un HEAD
solicitud a la URL para ver si el content-length
el encabezado está disponible. Si es más grande que su límite, puede detenerse allí mismo. Si no existe o es más pequeño que su límite, haga el real GET
petición. Desde un HEAD
la solicitud solo devolverá los encabezados y no el contenido real, esto ayudará a eliminar archivos grandes con válidos content-length
rápido.
A continuación, haga el verdadero GET
solicite y observe el tamaño de sus datos entrantes para asegurarse de que no exceda su límite (esto se puede hacer con el módulo de solicitud; vea a continuación). Querrá hacer esto independientemente de si el HEAD
la solicitud encontró un content-length
encabezado, como una verificación de cordura (el servidor podría estar mintiendo sobre el content-length
).
Algo como esto:
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);
);
El truco para ver el tamaño de los datos entrantes usando el módulo de solicitud es enlazar con el data
evento en la respuesta (como si estuvieras pensando en hacer usando el http
module) antes de comenzar a canalizarlo a su flujo de archivos. Si el tamaño de los datos supera el tamaño máximo de archivo, llame a la respuesta abort()
método.