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?
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 aContent-Disposition
como en el caso del nombre de archivo, mientras que Chrome da prioridad al atributo de descarga.
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 elContent-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
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 attachment
Chrome 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 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
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
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
- https://www.npmjs.com/package/file-saver
- https://www.npmjs.com/package/file-saver#saving-urls // URL directa a Guardar direcciones URL
- https://www.javascripting.com/view/filesaver-js
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