El atributo de descarga de Chrome no funciona para reemplazar el nombre original

6 minutos de lectura

Avatar de usuario de Buffer Overflow
Desbordamiento de búfer

He experimentado un comportamiento inesperado de Chrome desde la versión más reciente: mientras que en Firefox, este código funciona perfectamente bien:

<a 
  id="playlist"
  class="button"
  download="Name.xspf" 
  href="data:application/octet-stream;base64,PD94ANDSOON" 
  style="display: inline;">
    Download Me
</a>

No funciona en Chrome (simplemente descargando un archivo llamado “Descargar”), pero ha funcionado bastante bien antes. ¿Qué tengo que cambiar para que vuelva a funcionar?

  • Esto también sucede cuando abre su sitio web sin un servidor (como un host local), la instalación y el uso de la extensión Live Server de Ritiwick Dey en el código VS resuelve el problema, también puede usar cualquier otro servidor como apache o xampp, pero sería más fácil y más rápido para instalar la extensión Live Server de VS Code.

    – Rishav Jha

    28 de junio de 2021 a las 1:11

Avatar de usuario de Emanuel Vintilă
Emanuel Vintilă

Después de algunas investigaciones, finalmente encontré tu problema.

<a>Atributo de descarga:

Si el encabezado HTTP Content-Disposition: está presente y da un nombre de archivo diferente a este atributo, el encabezado HTTP tiene prioridad sobre este atributo.

Si este atributo está presente y Content-Disposition: está configurado en línea, Firefox da prioridad a Content-Dispositioncomo en el caso del nombre de archivo, mientras que Chrome da prioridad al atributo de descarga.

Fuente

Encabezado HTTP Content-Disposition

  • Mi servidor no parece enviar “Disposición de contenido” y, como lo describió usted, Firefox no descargaría el archivo correctamente, pero mi problema se invierte: Chrome no acepta el attr de descarga, mientras que Firefox sí. Incluso si solo creo un archivo HTML simple con solo esto como su contenido (y abierto como una URL de archivo), no funcionará en Chrome sino en Firefox. También funcionó antes de actualizar Chrome (Versión 35.0.1916.114 m)

    – Desbordamiento de búfer

    26 mayo 2014 a las 17:08


  • Tampoco funciona en Chrome para mí… Navegué por algunos sitios con una página de “Pruébalo”, pero ni sus ejemplos no funcionaron, ni algunos JSFIDDLE que intenté hacer. El único que funcionó fue Éste en W3Schools.

    – Emanuel Vintilă

    26 mayo 2014 a las 18:41

  • Parece ser un error en Chrome a partir de la versión 35: code.google.com/p/chromium/issues/detail?id=373182

    – Desbordamiento de búfer

    28 de mayo de 2014 a las 12:02


  • @MrMesees Si no recuerdo mal, los navegadores ya no respetan el atributo de descarga, a menos que href apunte a un recurso que está en el mismo origen. También vea la respuesta a continuación

    – Emanuel Vintilă

    7 febrero 2017 a las 19:27


  • Eso funciona si tiene control sobre el servidor, pero no es una solución para el Front-End. Todavía no puedo entender cómo hacerlo en html cuando el servidor no tiene el Content-Disposition encabezamiento.

    –Ryan Walker

    20 mayo 2019 a las 21:19

Al leer los comentarios, tuve el mismo problema que @buffer-overflow y encontré esto en el problema:

Supongo que la página web y la descarga tienen diferentes orígenes. Ya no respetamos el nombre de archivo sugerido del atributo de descarga para las solicitudes de origen cruzado. Al hacer clic en el enlace aún se inicia una descarga. Pero el nombre del archivo solo se deriva de factores que dependen únicamente del servidor (por ejemplo, encabezado de disposición de contenido en la respuesta y la URL).

Así que no hay posibilidad de que pueda hacer que funcione… 🙁

  • No hay nada sobre esa restricción en la recomendación W3C de HTML5 y HTML 5.1, pero puede encontrarla en la referencia de Mozilla. “Este atributo solo funciona para las URL del mismo origen”. – de developer.mozilla.org/en/docs/Web/HTML/Element/a#Atributos

    – Quidn

    02/04/2017 a las 19:43

  • Tengo el mismo problema con la versión 57 de Chrome a pesar de que no Content-Disposition el encabezado está presente. La única solución que encontré fue hacer que el servidor agregue el Content-Disposition encabezado y especifique el nombre del archivo allí.

    – Readren

    12 de abril de 2017 a las 7:59


  • estoy viendo un comportamiento totalmente diferente… ni siquiera es intentando para descargar, en su lugar, actúa como si el atributo de descarga no estuviera allí y reemplaza la página con la nueva imagen.

    – Miguel

    31 de marzo de 2020 a las 2:27

avatar de usuario de oware
consciente

Tuve este problema con wordpress, el problema es que wordpress genera la ruta completa del archivo, y en la etiqueta hay que eliminar el nombre de dominio completo y agregar una ruta relativa

Ejemplo, en lugar de:

<a href="http://mywordpresssite.com/wp-content/uploads/file.mp4" download="file.mp4" >

Tienes que hacer esto:

<a href="/wp-content/uploads/file.mp4" download="file.mp4">

Esto hará que funcione

  • Esto no está relacionado con la pregunta original, pero ha resuelto mi vida 🙂

    – Señor Louen

    19 de marzo de 2021 a las 14:35

  • Aquí igual. Parece que quizás Chrome asume que es de un dominio diferente si se especifica todo el dominio, incluso si eso no es cierto.

    – bishbashbosh

    14 de julio de 2021 a las 10:52

Este es el comportamiento actual en Chrome a partir de 16 ago, 2021

Si está llamando a una API como esta: http://localhost:9000/api/v1/service/email/attachment/dummy.pdf

Chrome intentará analizar el último valor del parámetro de ruta e ignorará cualquier valor pasado a attachment atributo de a enlace si Content-Disposition no está configurado o está configurado para inline del servidor, en cuyo caso el archivo pdf tendrá el nombre ficticio.pdf

Si Content-Disposition se establece en attachmentChrome guardará el archivo con el filename valor del encabezado Content-Disposition.

Eso es si el servidor respondiera así:

res.setHeader(
  "Content-disposition",
  "attachment; filename=" + "server-dummy.pdf"
);
res.setHeader("Content-Type", "application/pdf");

El archivo se guardaría como servidor-ficticio.pdf independientemente de la presencia del atributo de descarga.

AKSHAYA KUMAR Avatar de usuario de Satapathy
AKSHAYA KUMAR Satapatía

Tengo una solución simple con respecto a este problema. Solo necesita poner su archivo html en un servidor como Apache usando el control xampp y así sucesivamente. Porque el atributo de descarga funciona correctamente a través de un servidor.

<a download href="https://stackoverflow.com/questions/23872902/data:application/octet-stream;base64,PD94ANDSOON">Download Me</a>

  • Desafortunadamente, esto está limitado a 1 MB de datos, al menos en Chrome 73

    – icenac

    26 de marzo de 2019 a las 10:57

Avatar de usuario de Sachin
sachin

¿Está buscando los archivos a través de un servidor web o su sistema de archivos local? ¿La barra de URL del navegador comienza con http:// o file:///? Acabo de realizar algunas pruebas en Chrome y, aunque descargará el archivo, no respeta el valor del atributo de descarga cuando usa el archivo local.

Si comienza a alojarlo en un servidor web, esto comenzará a funcionar. Si solo está haciendo esto por sí mismo en su computadora, consulte WAMP para Windows o MAMP para macOS para comenzar con Apache.

  • Desafortunadamente, esto está limitado a 1 MB de datos, al menos en Chrome 73

    – icenac

    26 de marzo de 2019 a las 10:57

Avatar de usuario de Tunji Oyeniran
Tunji Oyenirán

Recomiendo usar el file-saver Paquete NPM para implementar o forzar la descarga.

// 1.
npm i file-saver // install via npm or
yarn add file-saver // install via yarn

// 2.
import { saveAs } from 'file-saver'

// 3. 
saveAs('https://httpbin.org/image', 'image.jpg')

Referencias

¿Ha sido útil esta solución?