¿Cómo puedo crear un enlace de descarga en HTML?

224

Tengo una idea básica de HTML. Quiero crear el enlace de descarga en mi sitio web de muestra, pero no tengo idea de cómo crearlo. ¿Cómo hago un enlace para descargar un archivo en lugar de visitarlo?

Venkat
fuente
11
La marca de aceptación para esta pregunta debe cambiarse.
Pekka

Respuestas:

163

Esta respuesta está desactualizada. Ahora tenemos el downloadatributo . (vea también este enlace a MDN )

Si por "el enlace de descarga" se refiere a un enlace a un archivo para descargar, use

  <a href="http://example.com/files/myfile.pdf" target="_blank">Download</a>

la target=_blankhará aparecer una nueva ventana del navegador antes de que comience la descarga. Esa ventana generalmente se cerrará cuando el navegador descubra que el recurso es una descarga de archivos.

Tenga en cuenta que los tipos de archivos conocidos por el navegador (por ejemplo, imágenes JPG o GIF) generalmente se abrirán dentro del navegador.

Puede intentar enviar los encabezados correctos para forzar una descarga como se describe, por ejemplo, aquí . (para ello se requiere una secuencia de comandos del lado del servidor o acceso a la configuración del servidor).

Pekka
fuente
1
¿por qué no utilizar el atributo de descarga? Si obtiene un archivo como un jpg, se descargará, en lugar de simplemente abrirse.
Ben
2
Omita el "target = '_ blank'", ya que eso no funcionará en IE. ¿Lo probaste siquiera?
Tara
44
@Dudeson, especifique qué "no funcionará" y de qué versión (s) de IE está hablando. (Sin embargo, ahora es seguro usar el enfoque que se describe a continuación en la respuesta mucho más reciente de TIIUNDER. Debería obtener la marca de aceptación.)
Pekka
2
@Sergiu la respuesta tiene siete años. No puedo eliminarlo, y el autor de la pregunta no ha respondido a mi solicitud para cambiar la marca de aceptación ... nada que podamos hacer, aunque agregaré un enlace a la respuesta más actual
Pekka
1
@ Dani ve la respuesta de TIIUNDER a continuación, que es la correcta ahora.
Pekka
455

En los navegadores modernos que admiten HTML5, es posible lo siguiente:

<a href="link/to/your/download/file" download>Download link</a>

También puedes usar esto:

<a href="link/to/your/download/file" download="filename">Download link</a>

Esto le permitirá cambiar el nombre del archivo que se está descargando.

Felix G.
fuente
Utilicé el mismo código para descargar el archivo PFD y probé en todos los navegadores, todos son compatibles, pero en Safari este código no funciona Safari en lugar de descargar el archivo pdf abierto en una nueva pestaña.
Renish Khunt
66
caniuse.com/#search=download%20attribute Funciona en Chrome, Edge, Firefox, Opera y los últimos navegadores Android 4.4+, y no en Internet Explorer y Safari.
Bart Verkoeijen
¿Cómo hago esto si estoy creando el enlace dinámicamente con un clic de botón?
Nongthonbam Tonthoi
1
@NongthonbamTonthoi no puede usar javascript para asignar dinámicamente el href a la etiqueta a
akshay kishore
1
Esto no necesariamente va a funcionar, ya que está limitado a las URL del mismo origen.
Nathan
22

Además (o en reemplazo) del <a downloadatributo de HTML5 ya mencionado,
el comportamiento de descarga al disco del navegador también puede ser activado por el siguiente encabezado de respuesta http:

Content-Disposition: attachment; filename=ProposedFileName.txt;

Esta era la forma de hacerlo antes de HTML5 (y aún funciona con navegadores compatibles con HTML5).

Myobis
fuente
44
Pero eso requiere una implementación del lado del servidor, ¿correcto?
Lombas
@Lombas sí, solo el servidor puede configurar los encabezados de respuesta http.
Myobis
¿Es esta la respuesta completa? También debe enviar un encabezado de tipo de contenido y leer el archivo para forzar la descarga. Puede querer y eso a su respuesta. Respuesta completa aquí: stackoverflow.com/a/1465631/2757916 .
Govind Rai
Esto es perfecto para la implementación del lado del servidor, solo precisa el tipo de contenido. está bien soportado en comparación con el downloadatributo
william.eyidi
9

Un enlace de descarga sería un enlace al recurso que desea descargar. Se construye de la misma manera que cualquier otro enlace sería:

<a href="path to resource.name of file">Link</a>

<a href="files/installer.exe">Link to installer</a>
Oded
fuente
8

Para vincular al archivo, haga lo mismo que cualquier otro vínculo de página:

<a href="...">link text</a>

Para forzar la descarga de cosas incluso si tienen un complemento incrustado (Windows + QuickTime = ugh), puede usar esto en su htaccess / apache2.conf:

AddType application/octet-stream EXTENSION
Delan Azabani
fuente
¡Gracias! ¡Esto es mucho más simple y abarca todo el servidor! : DI encontró este enlace que elabora un poco más. Gracias. htaccess-guide.com/adding-mime-types
Joe DF
Eso hará que todos los archivos de ese tipo solo se descarguen. Está bien si eso es lo que quieres, pero podría causar ataques si olvidas y quieres que otro archivo de ese tipo se muestre en el navegador en lugar de descargarlo.
TecBrat
4

Este hilo es probablemente antiguo por ahora, pero esto funciona en html5 para mi archivo local.

Para pdfs:

<p><a href="file:///........example.pdf" download target="_blank">test pdf</a></p>

Esto debería abrir el pdf en una nueva ventana y permitirle descargarlo (al menos en Firefox). Para cualquier otro archivo, simplemente conviértalo en el nombre del archivo. Sin embargo, para las imágenes y la música, querrás almacenarlas en el mismo directorio que tu sitio. Entonces sería como

<p><a href="images/logo2.png" download>test pdf</a></p>
johan
fuente
2

El atributo de descarga no funciona en IE, ignora la "descarga" por completo. La descarga no funciona en Firefox si href apunta a un sitio remoto. Entonces el ejemplo de Odin no funciona en Firefox 41.0.2.

Bill Coffin
fuente
1

Hay una sutileza más que puede ayudar aquí.

Quiero tener enlaces que permitan la reproducción y visualización en el navegador, así como uno solo para descargar. El nuevo atributo de descarga está bien, pero no funciona todo el tiempo porque la compulsión del navegador para reproducir o mostrar el archivo sigue siendo muy fuerte.

PERO ... esto se basa en el examen de la extensión en el nombre de archivo de la URL. No desea jugar con el mapeo de extensión del servidor porque desea entregar el mismo archivo de dos maneras diferentes. Entonces, para la descarga, puede engañarlo haciendo un enlace suave del archivo a un nombre que sea opaco a esta asignación de extensión, señalándolo y luego usando la función de cambio de nombre de la descarga para corregir el nombre.

<a target="_blank" download="realname.mp3" href="realname.UNKNOWN">Download it</a>
<a target="_blank" href="realname.mp3">Play it</a>

Esperaba simplemente lanzar una consulta ficticia al final o ofuscar la extensión de otra manera funcionaría, pero lamentablemente, no lo hace.

jhhl
fuente
0

El atributo de descarga es nuevo para la <a>etiqueta en HTML5

<a href="http://www.odin.com/form.pdf" download>Download Form</a>
o
<a href="http://www.odin.com/form.pdf" download="Form">Download Form</a>

Prefiero el primero, es preferible con respecto a cualquier extensión.

Odin
fuente
0

Puedes descargar de varias maneras puedes seguir mi camino. Aunque es posible que los archivos no se descarguen debido a que el permiso 'permitir ventanas emergentes' no está configurado, pero en su entorno, esto funcionará perfectamente

<div className="col-6">
                    <a  download href="https://www.w3schools.com/images/myw3schoolsimage.jpg" >Test Download </a>
                </div>

otro este también fallará debido a 'X-Frame-Options' a 'sameorigin'.

<a href="https://www.w3schools.com/images/myw3schoolsimage.jpg" download>
  <img src="https://www.w3schools.com/images/myw3schoolsimage.jpg" alt="W3Schools" width="104" height="142">
</a>

rey neo
fuente
-3

Me gusta esto

<a href="www.yoursite.com/theThingYouWantToDownload">Link name</a>

Entonces, un archivo name.jpg en un sitio example.com se vería así

<a href="www.example.com/name.jpg">Image</a>
Estafa
fuente
El problema con este último es que se abrirá en el navegador, no se ofrecerá para descargar y guardar.
Pekka,
99
No va a funcionar; el navegador lo tratará como un enlace relativo ./www.example.com/name.jpg; debe usarlo http://para enlaces absolutos con un dominio específico.
Delan Azabani
-7

Sé que llego tarde, pero esto es lo que obtuve después de 1 hora de búsqueda

 <?php 
      $file = 'file.pdf';

    if (! file) {
        die('file not found'); //Or do something 
    } else {
       if(isset($_GET['file'])){  
        // Set headers
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=$file");
        header("Content-Type: application/zip");
        header("Content-Transfer-Encoding: binary");
        // Read the file from disk
        readfile($file); }
    }

    ?>

y para el enlace descargable hice esto

<a href="index.php?file=file.pdf">Download PDF</a>
Sikander
fuente
66
Este es terrible. Cuando veo un enlace de descarga de este tipo, tengo que resistir el impulso de probar index.php? File = index.php que, en una implementación de copiar / pegar de su código, eventualmente le daría a una persona maliciosa acceso a su base de datos y quién sabe qué.
M.Stramm
1
Mala idea. Primero, porque está haciendo que su servidor funcione más de lo necesario. Segundo, porque los usuarios pueden descargar cualquier archivo: p
José Neto