javascript - Kaynak Document olarak yorumlandı ancak MIME türü application/zip ile aktarıldı


Chrome 12.0.742.112 ile, aşağıdaki başlıklarla yönlendirirsem:

HTTP/1.1 302 Found 
Location: http://0.0.0.0:3000/files/download.zip
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
X-Ua-Compatible: IE=Edge
X-Runtime: 0.157964
Content-Length: 0
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 05 Jul 2011 18:42:25 GMT
Connection: Keep-Alive

Takip edilirse aşağıdaki başlığı döndüren:

HTTP/1.1 200 OK 
Last-Modified: Tue, 05 Jul 2011 18:18:30 GMT
Content-Type: application/zip
Content-Length: 150014
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 05 Jul 2011 18:44:47 GMT
Connection: Keep-Alive

Chrome yönlendirme yapmayacak ve önceki sayfayı değiştirmeyecek, sadece konsolda aşağıdaki uyarıyı bildirecek:

Kaynak, Belge olarak yorumlandı ancak MIME türü application/zip ile transfer edildi.

Bu işlem Firefox'ta doğru çalışıyor ve Chrome'da da yeni bir sekme açıp doğrudan http://0.0.0.0:3000/files/download.zip adresine gidersem sorunsuz çalışıyor. Bir şeyi yanlış mı yapıyorum, yoksa bu Chrome'un bir hatası/garipliği mi?

Cevap #1

<a> etiketinizde HTML5 download özelliğini belirtebilirsiniz.

<a href="http://example.com/archive.zip" download>Export</a>

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download

Cevap #2

İstek başlığınızda Content-Type: text/html göndermişsiniz, bu da yanıtı HTML olarak yorumlamak istediğiniz anlamına geliyor. Şimdi, eğer sunucu size PDF dosyaları bile gönderirse, tarayıcınız bunu HTML olarak anlamaya çalışır. Sorun bu. Neden olabileceğini görmek için araştırıyorum. :)

Cevap #3

Mesajın kendisinin sadece bir açıklamasını herhangi bir yerde bulamadım. İşte benim yorumum.

Anladığım kadarıyla, Chrome muhtemelen gösterebileceği bazı materyalleri (belge) bekliyordu, ama gösteremeyeceği bir şey aldı (ya da gösterilmemesi söylenen bir şey).

Bu, belgenin HTML sayfa düzeyinde href ile nasıl beyan edildiği (Roy'un mesajındaki download özniteliğine bakın) ve sunucunun yanıtında HTTP başlıkları aracılığıyla (özellikle Content-Disposition) nasıl beyan edildiği ile ilgilidir. Bu, umut ve beklentinin aksine bir sözleşme meselesidir.

Evan’ın yoluna devam etmek için, şunu deneyimledim:

Content-type: application/pdf
Content-disposition: attachment; filename=some.pdf

şununla sadece tutarsızdır:

<a href='some.pdf'>

Chrome Kaynak belge olarak yorumlandı ama aktarıldı… diye ağlayacak

Aslında, attachment (ek) durumu sadece şunu ifade eder: tarayıcı bağlantıyı yorumlamayacak, bunun yerine başka - gizli - amaçlar için bir yere kaydedecektir. Yukarıda, ya href yanına download eklenmemiştir ya da Content-disposition başlıklardan kaldırılmalıdır. Bu, belgenin tarayıcı tarafından görüntülenmesini isteyip istemediğimize bağlıdır.

Umarım bu yardımcı olur.

Cevap #4

Bu sorunu bir PDF dosyası sunarken (MIME türü application/pdf) yaşadım ve Content-Disposition başlığını ayarlayarak çözdüm, örneğin:

Content-Disposition: attachment; filename=foo.pdf

Umarım yardımcı olur.

Cevap #5

Bunu düzelttim… sadece yeni bir sekme açarak.

Neden çalışmadığından tamamen emin değilim, ama bunun Chrome'un bir sayfadaki birden fazla indirme ile nasıl başa çıktığıyla ilgili olabileceğini düşünüyorum, belki de bunları spam olarak sandı ve sadece görmezden geldi.

Cevap #6

Javascript üzerinden bir dosya indirirken benzer bir sorun yaşadım. download özniteliğini eklemek bir fark yaratmadı ama target='_blank' eklemek işe yaradı - artık 'Resource interpreted as Document...' konsol mesajını almıyorum.

İşte benim gayet basit kodum:

var link = document.createElement('a');
link.target = '_blank';
link.href = url;
document.body.appendChild(link); // Required for Firefox
link.click();
link.remove(); 

Bunu doğrudan HTML ile denemedim ama işe yarayacağını beklerim.

Firefox'un linkin belgeye eklenmesini gerektirdiğini, oysa Chrome'un bunu yapmadan çalışacağını fark ettim.

İlgili makaleler