Apakah saya perlu Tipe Konten: aplikasi / octet-stream untuk pengunduhan file?

414

Standar HTTP mengatakan:

Jika tajuk ini [Disposisi Konten: lampiran] digunakan dalam respons dengan tipe konten aplikasi / octet-stream, saran yang tersirat adalah bahwa agen pengguna tidak boleh menampilkan respons, tetapi langsung memasukkan `simpan respons sebagai .. dialog. '

Saya membacanya sebagai

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

Tapi saya akan berpikir bahwa Content-Typeakan application/pdf, image/png, dll

Haruskah saya miliki Content-Type: application/octet-streamjika saya ingin browser mengunduh file?

Paul Draper
sumber

Jawaban:

959

Tidak.

Jenis konten harus berupa apa pun yang diketahui, jika Anda mengetahuinya. application/octet-streamdidefinisikan sebagai "data biner sewenang-wenang" dalam RFC 2046, dan ada tumpang tindih yang pasti di sini yang sesuai untuk entitas yang tujuan utamanya adalah untuk disimpan ke disk, dan sejak saat itu berada di luar dari apa pun "webby". Atau melihatnya dari arah lain; satu-satunya hal yang dapat dilakukan dengan aman dengan aplikasi / octet-stream adalah menyimpannya ke file dan berharap orang lain tahu untuk apa itu.

Anda dapat menggabungkan penggunaan Content-Dispositiondengan tipe konten lain, seperti image/pngatau bahkan text/htmluntuk menunjukkan bahwa Anda ingin menyimpan daripada menampilkan. Dulu ada kasus bahwa beberapa browser akan mengabaikannya dalam kasus text/htmltapi saya pikir ini sudah lama pada saat ini (dan saya akan segera tidur jadi saya tidak akan mulai menguji sejumlah besar browser sekarang; mungkin nanti).

RFC 2616 juga menyebutkan kemungkinan token ekstensi, dan hari-hari ini sebagian besar browser mengenali inlinebahwa Anda ingin entitas ditampilkan jika memungkinkan (yaitu, jika itu adalah tipe yang diketahui browser untuk ditampilkan, jika tidak maka tidak ada pilihan dalam hal ini) . Ini tentu saja merupakan perilaku default, tetapi itu berarti bahwa Anda dapat memasukkan filenamebagian dari header, yang akan digunakan browser (mungkin dengan beberapa penyesuaian sehingga ekstensi file cocok dengan norma sistem lokal untuk jenis konten yang dipertanyakan, mungkin tidak) sebagai saran jika pengguna mencoba menyimpan.

Karenanya:

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="picture.png"

Berarti "Saya tidak tahu apa ini. Harap simpan sebagai file, sebaiknya bernama picture.png".

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

Berarti "Ini adalah gambar PNG. Silakan simpan sebagai file, sebaiknya bernama picture.png".

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

Berarti "Ini adalah gambar PNG. Harap tampilkan kecuali Anda tidak tahu cara menampilkan gambar PNG. Jika tidak, atau jika pengguna memilih untuk menyimpannya, kami sarankan nama picture.png untuk file yang Anda simpan sebagai".

Dari inlinebeberapa browser yang mengenali beberapa akan selalu menggunakannya, sementara yang lain akan menggunakannya jika pengguna telah memilih "save link as" tetapi tidak jika mereka memilih "save" saat melihat (atau setidaknya IE dulu seperti itu, itu mungkin telah berubah beberapa tahun yang lalu).

Jon Hanna
sumber
30
Ini adalah jawaban yang bagus, dan akan sangat menyenangkan jika semuanya berjalan seperti itu. Namun sayangnya semua browser sebagian besar rusak. Misalnya, Google Chrome tidak akan membuka jendela "penyimpanan file" untuk Anda jika ini adalah respons Anda dari formulir, terlepas dari termasuk "Content-Disposition: attachment", bahkan dengan "application / octet-stream" sebagai tipe konten . Dan kemudian mereka mencetak pesan yang mengatakan Anda mungkin sedang diserang ... Tidak ada cara untuk membiarkan saya menyimpan file. Anda harus mengonfigurasi xdg-open walaupun Anda hanya ingin menyimpan file. Saya muak dengan ini.
dividebyzero
1
@dividebyzero bukan masalah yang pernah saya alami, termasuk dengan Chrome. Adakah hal lain yang tidak biasa dalam apa yang Anda lakukan?
Jon Hanna
1
Mengunggah file dengan enctype default akan salah dan mungkin hasil yang memicu deteksi serangan, bukan hanya jatuh untuk membuat konten file tersedia.
Jon Hanna
7
@Baca jika klien ingin menyimpannya, maka tidak masalah header apa yang dikirim (Anda dapat "menyimpan" atau "menyimpan tautan sebagai" pada apa pun di browser Anda), karena header adalah informasi, bukan aturan sehingga attachmentbisa jadi dianggap "terbaik untuk tidak menampilkan ini sendiri" sementara inlinesebagai "terbaik untuk menampilkan ini sendiri jika Anda bisa". Bagaimanapun, sebagian besar browser akan menggunakan nilai nama file sebagai nama file yang disarankan, tetapi pengguna selalu dapat menimpanya.
Jon Hanna
1
@ Presdin terima kasih. Saya agak bingung bahwa itu sangat populer, relatif terhadap beberapa orang lain saya akan mempertimbangkan lebih baik, tapi saya kira itu pasti telah mencapai titik menjawab masalah orang.
Jon Hanna