¿Necesito tipo de contenido: aplicación/octeto-stream para descargar archivos?

Resuelto Paul Draper asked hace 11 años • 2 respuestas

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-Typesería application/pdf, image/png, etc.

¿Debería hacerlo Content-Type: application/octet-streamsi quiero que los navegadores descarguen el archivo?

Paul Draper avatar Dec 11 '13 08:12 Paul Draper
Aceptado

No.

El tipo de contenido debe ser el que se conoce, si lo sabes. application/octet-streamse 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-Dispositioncon otros tipos de contenido, como image/pngo incluso text/htmlpara indicar que desea guardar en lugar de mostrar. Solía ​​darse el caso de que algunos navegadores lo ignoraban en el caso de text/htmlpero 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 inlineque 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 filenameparte 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, inlinealgunos 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).

Jon Hanna avatar Dec 11 '2013 02:12 Jon Hanna