Estoy tratando de escribir un script para descargar imágenes usando node.js. Esto es lo que tengo hasta ahora:
var maxLength = 10 // 10mb
var download = function(uri, callback) {
http.request(uri)
.on('response', function(res) {
if (res.headers['content-length'] > maxLength*1024*1024) {
callback(new Error('Image too large.'))
} else if (!~[200, 304].indexOf(res.statusCode)) {
callback(new Error('Received an invalid status code.'))
} else if (!res.headers['content-type'].match(/image/)) {
callback(new Error('Not an image.'))
} else {
var body = ''
res.setEncoding('binary')
res
.on('error', function(err) {
callback(err)
})
.on('data', function(chunk) {
body += chunk
})
.on('end', function() {
// What about Windows?!
var path = '/tmp/' + Math.random().toString().split('.').pop()
fs.writeFile(path, body, 'binary', function(err) {
callback(err, path)
})
})
}
})
.on('error', function(err) {
callback(err)
})
.end();
}
Sin embargo, quiero hacer esto más robusto:
- ¿Hay bibliotecas que hacen esto y lo hacen mejor?
- ¿Existe la posibilidad de que los encabezados de respuesta mientan (sobre la longitud, sobre el tipo de contenido)?
- ¿Hay otros códigos de estado que me interesen? ¿Debo molestarme con las redirecciones?
- Creo que leí en alguna parte que
binary
codificación quedará en desuso. ¿Qué hago entonces? - ¿Cómo puedo hacer que esto funcione en Windows?
- ¿De alguna otra manera puedes mejorar este script?
Por qué: para una función similar a imgur donde los usuarios me pueden dar una URL, descargo esa imagen y vuelvo a alojar la imagen en varios tamaños.
image
node.js
image-processing
download
Jonathan Ong
fuente
fuente
Me encontré con este problema hace unos días, por una respuesta pura de NodeJS, sugeriría usar Stream para fusionar los fragmentos.
Las versiones más recientes de Node no funcionarán bien con cadenas binarias, por lo que fusionar fragmentos con cadenas no es una buena idea cuando se trabaja con datos binarios.
* Solo tenga cuidado al usar 'data.read ()', vaciará el flujo para la próxima operación 'read ()'. Si desea usarlo más de una vez, guárdelo en algún lugar.
fuente
Puede usar Axios (un cliente HTTP basado en promesas para Node.js) para descargar imágenes en el orden que elija en un entorno asíncrono :
Luego, puede usar el siguiente ejemplo básico para comenzar a descargar imágenes:
fuente
download_image
para capturar el evento 'finalizar' y 'error' para la promesa devueltasi quieres progreso descarga intenta esto:
cómo utilizar:
nota: debe instalar los módulos request y request-progress utilizando:
fuente
statusCode
cheque. Un 500 statusCode, por ejemplo, no golpeará el'on("error", e)
. Al agregar unon('response', (response) => console.error(response.statusCode))
Sobre la base de lo anterior, si alguien necesita manejar errores en las secuencias de escritura / lectura, utilicé esta versión. Tenga
stream.read()
en cuenta que en caso de un error de escritura, es necesario para que podamos terminar de leer y dispararclose
en la secuencia de lectura.fuente
stream.read()
parece estar desactualizado, arroja un errornot a function
fuente
Esta es una extensión de la respuesta de Cezary. Si desea descargarlo a un directorio específico, use esto. Además, use const en lugar de var. Es seguro de esta manera.
fuente