El estándar HTTP dice:
Si este encabezado [Content-Disposition: attachment] se utiliza en una respuesta con la aplicación / octet-stream content-type, la sugerencia implícita es que el agente de usuario no debe mostrar la respuesta, sino que debe ingresar directamente una `respuesta de guardado como … . ‘diálogo.
Lo leí como
Content-Type: application/octet-stream Content-Disposition: attachment
Pero hubiera pensado que Content-Type
sería application/pdf
, image/png
, etc.
¿Debería tener Content-Type: application/octet-stream
si quiero que los navegadores descarguen el archivo?
No.
El tipo de contenido debe ser lo que se sabe que es, si lo sabes. application/octet-stream
se define como “datos binarios arbitrarios” en RFC 2046, y hay una superposición definida aquí de que sea apropiado para entidades cuyo único propósito previsto es guardarse en el disco, y desde ese punto estar fuera de cualquier cosa ” webby “. O mirarlo desde otra dirección; lo único que se puede hacer de manera segura con application / octet-stream es guardarlo en un archivo y esperar que alguien más sepa para qué sirve.
Puede combinar el uso de Content-Disposition
con otros tipos de contenido, como image/png
o incluso text/html
para indicar que desea guardar en lugar de mostrar. Solía ocurrir que algunos navegadores lo ignoran en el caso de text/html
pero creo que esto fue hace mucho tiempo en este punto (y me voy a la cama pronto, así que no voy a comenzar a probar un un montón de navegadores en este momento, tal vez más tarde).
RFC 2616 también menciona la posibilidad de tokens de extensión, y en estos días la mayoría de los navegadores reconocen en inline
que quiere que la entidad se muestre si es posible (es decir, si es un tipo que el navegador sabe cómo mostrar; de lo contrario, no tiene elección) ) Por supuesto, este es el comportamiento predeterminado, pero significa que puede incluir el filename
de filename
del encabezado, que los navegadores usarán (quizás con algún ajuste para que las extensiones de archivo coincidan con las normas del sistema local para el tipo de contenido en cuestión, quizás no ) como la sugerencia si el usuario intenta guardar.
Por lo tanto:
Content-Type: application/octet-stream Content-Disposition: attachment; filename="picture.png"
Significa “No sé qué diablos es esto. Guárdalo como un archivo, preferiblemente llamado picture.png”.
Content-Type: image/png Content-Disposition: attachment; filename="picture.png"
Significa “Esta es una imagen PNG. Guárdala como un archivo, preferiblemente llamado picture.png”.
Content-Type: image/png Content-Disposition: inline; filename="picture.png"
Significa “Esta es una imagen PNG. Márcala a menos que no sepas cómo mostrar las imágenes PNG. De lo contrario, o si el usuario elige guardarla, recomendamos el nombre picture.png para el archivo que guardaste como”.
De esos navegadores que reconocen en inline
algunos siempre lo usarían, mientras que otros lo usarían si el usuario hubiera seleccionado “guardar enlace como” pero no si hubieran seleccionado “guardar” mientras lo veían (o al menos IE solía ser así, puede haber cambiado hace algunos años).