Forzar la descarga de un fichero

23 de noviembre de 2020

No creo que sea el único al que le ha pasado que, cuando espero que un fichero se descargue, el navegador decide mostrármelo por la pantalla en lugar de guardármelo en el equipo.

Bueno, parece que esto es cosa de las configuraciones por defecto de estos programas y cómo tratan cada tipo de archivo, pero siendo nosotros los desarrolladores ¿podemos forzar que un archivo se descargue en lugar de dejar esta decisión al navegador? Pues sí.

El atributo «download»

Muchas etiquetas HTML aceptan atributos que, de alguna manera, modifican cómo los navegadores deben que interpretarlas. La etiqueta <a>, no iba a ser una excepción, de hecho, no veo que tenga mucho sentido de otra manera. Entre los atributos de uso común para esta etiqueta están id, href, title, name, rel, target… y uno un poco menos conocido «download».

Este atributo, dentro de la etiqueta <a> informa al navegador de que el enlace, en href, es un fichero que debe descargar al equipo, no mostrarlo por pantalla.

«download» puede usarse solo, o con un valor, que será el nombre del fichero cuando se produzca la descarga.

Ejemplos, los ejemplos molan:

<a href="./mifichero.jpeg">Fichero</a>Lenguaje del código: HTML, XML (xml)

Dejará al navegador que decida qué hacer con el enlace. Podría descargar la imagen, o mostrarla en la ventana.

<a href="./mifichero.jpeg" download>Fichero</a>Lenguaje del código: HTML, XML (xml)

Si es más o menos moderno y entiende el atributo, sabrá que tiene que descargar el fichero, y no mostrarlo en pantalla.

Finalmente, con

<a href="./mifichero.jpeg" download="nombre_del_fichero.jpg">Fichero</a> Lenguaje del código: HTML, XML (xml)

el navegador descargará el fichero, y debería guardarlo como «nombre_del_fichero.jpg». Pero no siempre es así y muchos ignoran este nombre sugerido.

Usar Content-Disposition en .htaccess

Si lo anterior falla, se puede recurrir a editar .htaccess para enviar las cabeceras necesarias al navegador para que se entere de que debería descargar el fichero, o mostrarlo siempre por pantalla.

O porque falla, o porque nos viene mejor hacerlo así.

Para esto, Content-Disposition puede tomar dos valores: attachment, que indica que es un descargable; o inline, para indicarle que debe mostrarlo en la ventana.

Ejemplos: (¿Ya dije que molan?)

<Files ./mifichero.jpeg>
    Header set "Content-Disposition" "attachment"; "filename" "elfichero.jpg" 
</Files>
Lenguaje del código: Apache (apache)
# Queremos que se descargen todos los ficheros
# jpg, jpeg, png, pdf y webp
<FilesMatch "\.(jpe?g|png|pdf|webp)$">
    Header set Content-Disposition attachment
</FilesMatch>

# Queremos que se muestren los
# ficheros txt y md
<FilesMatch "\.(txt|md)$">
    Header set Content-Disposition inline
</FilesMatch>
Lenguaje del código: Apache (apache)

Seguro que muchas veces te ha pasado. Es un mal menor, al fin y al cabo, para algo está el botón derecho, pero es cierto que muchos usuarios no están acostumbrados a él y saber esto, seguro que les ayudará.

¡Hala! ¡Un saludo!

Un comentario en “Forzar la descarga de un fichero”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.