¿Necesito Content-Type: application / octet-stream para descargar archivos?

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).