cómo descargar archivos en reaccionar js
Recibo la URL del archivo como respuesta de la API. cuando el usuario hace clic en el botón de descarga, el archivo debe descargarse sin abrir la vista previa del archivo en una nueva pestaña. ¿Cómo lograr esto en reaccionar js?
tldr; obtenga el archivo de la URL, guárdelo como un Blob local, inyecte un elemento de enlace en el DOM y haga clic en él para descargar el Blob.
Tenía un archivo PDF almacenado en S3 detrás de una URL de Cloudfront. Quería que el usuario pudiera hacer clic en un botón e iniciar inmediatamente una descarga sin abrir una nueva pestaña con una vista previa en PDF. Generalmente, si un archivo está alojado en una URL que tiene un dominio diferente al sitio en el que se encuentra actualmente el usuario, muchos navegadores bloquean las descargas inmediatas por razones de seguridad del usuario. Si utiliza esta solución, no inicie la descarga del archivo a menos que un usuario haga clic en un botón para descargarlo intencionalmente.
Para superar esto, necesitaba obtener el archivo de la URL evitando las políticas CORS para guardar un Blob local que luego sería la fuente del archivo descargado. En el código siguiente, asegúrese de intercambiar sus propios archivos fileURL
, Content-Type
y FileName
.
fetch('https://cors-anywhere.herokuapp.com/' + fileURL, {
method: 'GET',
headers: {
'Content-Type': 'application/pdf',
},
})
.then((response) => response.blob())
.then((blob) => {
// Create blob link to download
const url = window.URL.createObjectURL(
new Blob([blob]),
);
const link = document.createElement('a');
link.href = url;
link.setAttribute(
'download',
`FileName.pdf`,
);
// Append to html link element page
document.body.appendChild(link);
// Start download
link.click();
// Clean up and remove the link
link.parentNode.removeChild(link);
});
Esta solución hace referencia a soluciones para obtener un blob desde una URL y utilizar un proxy CORS .
Actualización A partir del 31 de enero de 2021 , la demostración de cors-anywhere alojada en servidores Heroku solo permitirá un uso limitado con fines de prueba y no se podrá utilizar para aplicaciones de producción. Tendrá que alojar su propio servidor cors-anywhere siguiendo cors-anywhere o cors-server .
Esto no está relacionado con React. Sin embargo, puede utilizar el download
atributo en el <a>
elemento de anclaje para indicarle al navegador que descargue el archivo.
<a href='/somefile.txt' download>Click to download</a>
Esto no es compatible con todos los navegadores: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a
Si está utilizando React Router, use esto:
<Link to="/files/myfile.pdf" target="_blank" download>Download</Link>
¿ Dónde /files/myfile.pdf
está dentro de tu public
carpeta?
Activar la descarga del navegador desde la interfaz no es confiable.
Lo que debe hacer es crear un punto final en un servidor que, cuando se le llame, responda con los encabezados de respuesta correctos, lo que activará la descarga del navegador.
El código frontend solo puede hacer mucho. El atributo 'descargar', por ejemplo, podría simplemente abrir el archivo en una nueva pestaña según el navegador y el tipo de archivo.
Los encabezados de respuesta que debes mirar son Content-Type
y Content-Disposition
. Debería consultar esta respuesta para obtener una explicación más detallada sobre esos encabezados.