¿Necesito Content-Type: application / octet-stream para la descarga de archivos?

414

El estándar HTTP dice:

Si este encabezado [Content-Disposition: adjunto] se usa en una respuesta con el tipo de contenido application / octet-stream, la sugerencia implícita es que el agente de usuario no debe mostrar la respuesta, sino ingresar directamente una 'guardar respuesta como ... . 'diálogo.

Lo leí como

Content-Type: application/octet-stream
Content-Disposition: attachment

Pero yo habría pensado que Content-Typesería application/pdf, image/png, etc.

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

Paul Draper
fuente

Respuestas:

959

No.

El tipo de contenido debe ser lo que se sabe que es, si lo sabe. application/octet-streamse define como "datos binarios arbitrarios" en RFC 2046, y hay una superposición definitiva aquí de que es apropiado para entidades cuyo único propósito es guardar en el disco y, a partir de ese momento, estar fuera de todo "webby". O mirarlo desde otra dirección; lo único que se puede hacer con seguridad 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 ​​ser el caso de que algunos navegadores lo ignoraran en el caso de, text/htmlpero creo que esto fue hace mucho tiempo en este momento (y me voy a la cama pronto, así que no voy a comenzar a probar 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 inlineque quiere decir 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) . Por supuesto, este es el comportamiento predeterminado de todos modos, pero significa que puede incluir la filenameparte 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, tal vez 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é demonios es esto. Guárdelo como un archivo, preferiblemente llamado picture.png".

Content-Type: image/png
Content-Disposition: attachment; filename="picture.png"

Significa "Esta es una imagen PNG. Guárdela como un archivo, preferiblemente llamado picture.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 elige guardarla, le recomendamos el nombre picture.png para el archivo en el que la guardó".

De esos navegadores que reconocen, inlinealgunos siempre lo usarían, mientras que otros lo usarían si el usuario hubiera seleccionado "guardar enlace como", pero no si hubieran seleccionado "guardar" durante la visualización (o al menos IE solía ser así, puede haber cambiado hace algunos años).

Jon Hanna
fuente
30
Esta fue una gran respuesta, y sería realmente bueno si las cosas funcionaran así. Pero desafortunadamente todos los navegadores están en su mayoría rotos. Por ejemplo, Google Chrome no abrirá una ventana de "guardar archivo" si esta es su respuesta de un formulario, independientemente de incluir "Content-Disposition: adjunto", incluso con "application / octet-stream" como tipo de contenido . Y luego imprimen un mensaje que dice que puede estar bajo ataque ... Simplemente no hay forma de que me permita guardar un archivo. Debe configurar xdg-open incluso si solo desea guardar un archivo. Estoy harto de esto.
dividebyzero
1
@dividebyzero no es un problema que haya tenido, incluso con Chrome. ¿Hay algo más inusual en lo que estás haciendo?
Jon Hanna
1
Cargar un archivo con el enctype predeterminado sería incorrecto y quizás el resultado de eso desencadenó alguna detección de ataque, en lugar de simplemente caer para que el contenido del archivo esté disponible.
Jon Hanna
77
@Wilt si el cliente quiere guardarlo, entonces no importa qué encabezados se envíen (puede "guardar" o "guardar enlace como" en cualquier cosa en su navegador), ya que los encabezados son información, no reglas, por lo que attachmentpodrían ser considerado "mejor no mostrar esto usted mismo" mientras inlineque "mejor mostrar esto usted mismo si puede". De cualquier manera, la mayoría de los navegadores usarán el valor del nombre de archivo como el nombre sugerido del archivo, pero los usuarios siempre pueden anularlo.
Jon Hanna
1
@Tresdin gracias. Estoy un poco desconcertado de que sea tan popular, en relación con algunos de mis otros que consideraría mejor, pero supongo que debe haber dado en el clavo para responder a los problemas de las personas.
Jon Hanna