Estoy tratando de descargar la imagen y guardarla en mi servidor desde la dirección URL. Entonces, por ejemplo, hago una solicitud POST con la URL de la imagen. Descargo la imagen y la guardo en mi servidor. El problema surge cuando necesito calcular la extensión de la imagen. En este momento funciona estáticamente solo para archivos jpg, pero también debería funcionar para png. ¿Cómo puedo averiguar la extensión del archivo antes de guardarlo?
Una forma sería obtener la extensión desde la propia URL, pero no todas las URL tendrán la extensión, por ejemplo: https://media.istockphoto.com/photos/winter-in-the-sequoias-picture-id1292624259
Este es el código que he hecho ahora mismo. Funciona, sin embargo, como dije, es estático y solo funciona para jpg:
var config = { responseType: 'stream' }; async function getImage(url) { let time = Math.floor(Date.now() / 1000) let resp = await axios.get(url, config) resp.data.pipe(fs.createWriteStream(time+'.jpg')) // here I need to get the image extension isntead of static '.jpg' }Puede usar encabezados de respuesta para eso. El encabezado Content-Type debe indicarle el tipo de archivo y con Content-Disposition puede obtener el nombre del archivo con la extensión.
En su código puede acceder a estos encabezados como este
resp.headers['content-type']; resp.headers['content-disposition'];Sugeriría usar un módulo como mime para obtener la extensión del tipo de contenido.
Ejemplo completo:
const axios = require('axios'); const fs = require('fs'); const mime = require('mime'); var config = { responseType: 'stream' }; async function getImage(url) { let time = Math.floor(Date.now() / 1000) let resp = await axios.get(url, config) const contentLength = resp.headers['content-length']; const contentType = resp.headers['content-type']; const extension = mime.extension(contentType); console.log(`Content type: ${contentType}`); console.log(`Extension: ${extension}`); const fileName = time + "." + extension; console.log(`Writing ${contentLength} bytes to file ${fileName}`); resp.data.pipe(fs.createWriteStream(fileName)); } const url = 'https://media.istockphoto.com/photos/winter-in-the-sequoias-picture-id1292624259'; getImage(url)Esto dará una salida algo así como:
Tipo de contenido: imagen/jpeg Extensión: jpeg Escribiendo 544353 bytes en el archivo 1638867349.jpeg