Estoy tratando de descargar archivos. El problema es que no se como obtener su extensión y me cargan mal, en cambio si al poner su nombre escribo la extensión (sabiendo cual es) se descarga correctamente. El problema es que en la app no sabes que tipo de archivo te llega, puedes sacar un pdf, un jpg,... Lo que hago es hacer una solicitud desde el backend de NodeJS a AWS S3 para recibir el archivo y lo envío a la interfaz de reaccionar.
Aquí está el código de fondo:
routerTrainer.get("/download-training", async (req, res) => { const { training_id } = req.headers; let training = await Training.findOne({ where: { id: training_id }, }); if (training) { let readStream = getTrainingS3(`${training.file_id}`); readStream.on('close', () => { res.end() }) readStream.pipe(res); } });Y aquí está el código de los clientes:
const downloadTraining = async (id) => { fetch(`${serverPath}/download-training`, { headers: { training_id: id, }, }) .then((res) => res.blob()) .then((blob) => { const link = document.createElement("a"); link.href = URL.createObjectURL(blob); link.setAttribute("download", `here_is_where_I_need_to_put_extension_to_get_it_working`); document.body.appendChild(link); link.click(); }); };Por favor, si alguien tiene alguna idea sobre cómo hacerlo, estaría muy agradecido por su ayuda.
Si entiendo correctamente, su archivo está en S3. Esto hace que su enfoque no sea válido aquí. S3 tiene un enfoque muy específico para las cargas y descargas de archivos y eso es a través de "URL prefirmadas" y si usara ese enfoque estándar, no estaría enfrentando el problema que enfrenta en primer lugar.
Más información sobre las URL prefirmadas: https://aws.amazon.com/blogs/developer/generate-presigned-url-modular-aws-sdk-javascript/
Pero la idea general es la siguiente:
Entonces, para responder a la pregunta original, su archivo en S3 probablemente tenga una extensión. Cuando genere la URL prefirmada, esa URL contendrá el nombre completo del archivo junto con la extensión, por lo que realmente no tiene que preocuparse por eso.