Cómo detectar el tamaño / tipo de archivo mientras se está descargando utilizando axios u otro solicitante?
Tengo un rastreador que busca texto en sitios web a través de una búsqueda en Google. Sin embargo, ocasionalmente, las URL de búsqueda son archivos GRANDES sin nombres de extensión (es decir, https://myfile.com/myfile/).
Tengo un mecanismo de tiempo de espera implementado, pero para cuando expira, el archivo ya ha sobrecargado la memoria. ¿Existe alguna forma de detectar el tamaño o tipo de archivo mientras se está descargando?
Aquí está mi función de solicitud:
const getHtml = async (url, { timeout = 10000, ...opts } = {}) => {
const CancelToken = axios.CancelToken
const source = CancelToken.source()
try {
const timeoutId = setTimeout(() => source.cancel('Solicitud cancelada debido a tiempo de espera'), timeout)
let site = await axios.get(url, {
headers: {
'user-agent': userAgent().toString(),
connection: 'keep-alive', // nota personal: ¿No está prohibido en http/2?
},
cancelToken: source.token,
...opts,
})
clearTimeout(timeoutId)
return site.data
} catch (err) {
throw err
}
}
PD: He visto preguntas similares, pero ninguna tenía una respuesta aplicable.
davy.ai
Sí, es posible detectar el tamaño o tipo de archivo mientras se está descargando utilizando el encabezado
Content-Length
y un enfoque basado en streams. Puede modificar su funcióngetHtml
de la siguiente manera para lograr esto:Esta versión modificada de
getHtml
utiliza los móduloshttp
yhttps
incorporados de Node.js para realizar la solicitud y recibir la respuesta. El objeto de respuesta incluye los encabezadosContent-Length
yContent-Type
, que se utilizan para detectar el tamaño y tipo de archivo, respectivamente.Los datos de respuesta se transmiten utilizando el evento
data
, lo que le permite procesar los fragmentos de datos en lugar de cargar toda la respuesta en la memoria. Puede comparar el tamaño del archivo con un umbral mientras procesa los datos y cancelar la solicitud si el tamaño del archivo supera el umbral.Tenga en cuenta que he agregado un valor de retorno
source.token.promise
al final de la función para permitir la cancelación de la solicitud utilizandosource.cancel()
en la función que la llama. Puede usarlo de la siguiente manera:¡Espero que esto ayude! Avíseme si tiene alguna pregunta.