Dosya indirmek için Content-Type: application / octet-stream'e ihtiyacım var mı?


414

HTTP standart diyor ki:

Bu üstbilgi [Content-Disposition: attachment], application / octet-stream içerik türüyle bir yanıt olarak kullanılıyorsa, ima edilen öneri, kullanıcı aracının yanıtı görüntülememesi, ancak doğrudan bir yanıt kaydetme olarak girmesidir. iletişim kutusunu tıklayın.

Bunu okudum

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

Ama sanırdım Content-Typeolurdu application/pdf, image/pngvb

Content-Type: application/octet-streamTarayıcıların dosyayı indirmesini isteyip istemediğimi bilmem gerekir mi?

Yanıtlar:


959

Hayır.

İçerik türü, biliniyorsa, ne olursa olsun bilinmelidir. application/octet-streamRFC 2046'da "keyfi ikili veriler" olarak tanımlanır ve burada tek amacı amacı diske kaydedilmek ve bu noktadan itibaren "webby" dışında kalan varlıklar için uygun olması konusunda kesin bir çakışma vardır. Veya başka bir yönden bakmak için; Birinin application / octet-stream ile güvenli bir şekilde yapabileceği tek şey, dosyayı dosyaya kaydetmek ve başka birinin bunun ne için olduğunu bildiğini ummaktır.

Kullanımını, görüntülemek yerine kaydetmek istediğinizi belirtmek için veya hatta Content-Dispositiondiğer içerik türleriyle birleştirebilirsiniz . Eskiden bazı tarayıcıların bunu görmezden geleceği durumdaydı , ancak bu uzun zaman önce bu noktada olduğunu düşünüyorum (ve yakında yatacağım, bu yüzden bir sürü test yapmaya başlamayacağım. tarayıcılar şu anda; belki daha sonra).image/pngtext/htmltext/html

RFC 2616 ayrıca uzatma belirteçleri olasılığından da bahsetmektedir ve bu günlerde çoğu tarayıcı inline, varlığın mümkünse görüntülenmesini istediğinizi belirtmektedir (yani, tarayıcının nasıl görüntüleneceğini bildiği bir türse, başka türlü bir seçeneğe sahip değildir) . Bu elbette varsayılan davranıştır, ancak filenameüstbilginin tarayıcıların kullanacağı kısmını ekleyebileceğiniz anlamına gelir (belki de bazı ayarlarla, dosya uzantılarının söz konusu içerik türü için yerel sistem normlarıyla eşleşmesi, belki değil) kullanıcı kaydetmeye çalışırsa öneri olarak.

Dolayısıyla:

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

"Bunun ne olduğunu bilmiyorum. Lütfen bunu bir dosya olarak kaydedin, tercihen picture.png olarak adlandırın".

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

"Bu bir PNG görüntüsüdür. Lütfen tercihen resim.png adlı bir dosya olarak kaydedin" anlamına gelir.

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

"Bu bir PNG görüntüsüdür. PNG görüntülerinin nasıl görüntüleneceğini bilmiyorsanız lütfen görüntüleyin. Aksi takdirde veya kullanıcı kaydetmeyi seçerse, kaydettiğiniz dosya için picture.png adını öneriyoruz".

inlineBazılarını tanıyan tarayıcılardan her zaman kullanır, diğerleri ise kullanıcı "bağlantıyı farklı kaydet" i seçtiyse, ancak görüntüleme sırasında "kaydet" i seçtiyse (veya en azından IE eskiden böyle olurdu) kullanmaz. birkaç yıl önce değişmiş olabilir).


30
Bu harika bir cevaptı ve işler böyle çalışsaydı gerçekten güzel olurdu. Ancak maalesef tüm tarayıcılar çoğunlukla bozuk. Örneğin, içerik türünde "application / octet-stream" olsa bile, "Content-Disposition: attachment" ifadesini dahil etmeden bağımsız olarak, bir formdan yanıtınız buysa, Google Chrome sizin için bir "dosya kaydetme" penceresi açmaz. . Ve sonra saldırı altında olabileceğinizi söyleyen bir mesaj yazdırıyorlar ... Bir dosyayı kaydetmeme izin vermenin bir yolu yok. Bir dosyayı kaydetmek isteseniz bile xdg-open'ı yapılandırmanız gerekir. Buna hasta oluyorum.
dividebyzero

1
@dividebyzero, Chrome da dahil olmak üzere yaşadığım bir sorun değil. Yaptığınız işte alışılmadık başka bir şey var mı?
Jon Hanna

1
Varsayılan şifreleme içeren bir dosyanın yüklenmesi yanlış olur ve bunun sonucu olarak, dosya içeriğini kullanılabilir hale getirmek yerine düşmek yerine bazı saldırı algılamaları tetiklenir.
Jon Hanna

7
İstemci kaydetmek istiyorsa, o zaman mesele başlıkları başlıkları bilgilerdir olarak, o kadar yönetir, (olabildiğince veya tarayıcınızda bir şey üzerinde "Bağlantıyı farklı kaydet" "save") gönderilir gelmez @Wilt neyi attachmentolabilir "bunu kendiniz göstermemek en iyisi" olarak kabul edilirken inline"bunu yapabiliyorsanız en iyisi kendiniz görüntülemek" olarak kabul edilir. Her iki durumda da, çoğu tarayıcı dosya adı değerini dosyanın önerilen adı olarak kullanır, ancak kullanıcılar bunu her zaman geçersiz kılabilir.
Jon Hanna

1
@Tresdin teşekkürler. Biraz popüler değilim, diğerlerine göre daha iyi düşünürdüm, ama sanırım insanların sorunlarını cevaplama noktasına gelmiş olmalı.
Jon Hanna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.