¿Necesito tipo de contenido: aplicación/octeto-stream para descargar archivos?
El estándar HTTP dice:
Si este encabezado [Disposición de contenido: archivo adjunto] se usa en una respuesta con el tipo de contenido aplicación/flujo de octeto, la sugerencia implícita es que el agente de usuario no debe mostrar la respuesta, sino ingresar directamente "guardar respuesta como... .'diálogo.
lo leí como
Content-Type: application/octet-stream
Content-Disposition: attachment
Pero habría pensado que Content-Type
sería application/pdf
, image/png
, etc.
¿Debería hacerlo Content-Type: application/octet-stream
si quiero que los navegadores descarguen el archivo?
No.
El tipo de contenido debe ser el que se conoce, si lo sabes. application/octet-stream
se define como "datos binarios arbitrarios" en RFC 2046, y aquí hay una superposición definida de que es apropiado para entidades cuyo único propósito es guardarse en el disco y, a partir de ese momento, estar fuera de cualquier cosa "webby". O mirarlo desde otra dirección; Lo único que se puede hacer de forma 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 darse el caso de que algunos navegadores lo ignoraban en el caso de text/html
pero creo que esto fue hace mucho tiempo en este momento (y me iré a la cama pronto, así que no voy a empezar a probar un montón de navegadores ahora mismo; tal vez más adelante).
RFC 2616 también menciona la posibilidad de tokens de extensión, y hoy en día la mayoría de los navegadores reconocen inline
que desea que se muestre la entidad si es posible (es decir, si es un tipo que el navegador sabe cómo mostrar; de lo contrario, no tiene otra opción al respecto). . Por supuesto, este es el comportamiento predeterminado de todos modos, pero significa que puede incluir la filename
parte del encabezado que usarán los navegadores (quizás con algún ajuste para que las extensiones de archivos coincidan con las normas del sistema local para el tipo de contenido en cuestión, quizás no). como sugerencia si el usuario intenta guardar.
Por eso:
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="picture.png"
Significa "No sé qué diablos es esto. Guárdelo como un archivo, preferiblemente llamado imagen.png".
Content-Type: image/png
Content-Disposition: attachment; filename="picture.png"
Significa "Esta es una imagen PNG. Guárdela como un archivo, preferiblemente llamado imagen.png".
Content-Type: image/png
Content-Disposition: inline; filename="picture.png"
Significa "Esta es una imagen PNG. Muéstrela a menos que no sepa cómo mostrar imágenes PNG. De lo contrario, o si el usuario decide guardarla, recomendamos el nombre imagen.png para el archivo como lo guarde".
De los navegadores que reconocen, inline
algunos lo usarían siempre, mientras que otros lo usarían si el usuario hubiera seleccionado "guardar enlace como", pero no si hubiera seleccionado "guardar" mientras visualizaba (o al menos IE solía ser así, así puede haber cambiado hace algunos años).