Sumber daya diartikan sebagai Dokumen tetapi ditransfer dengan aplikasi / zip tipe MIME

199

Dengan Chrome 12.0.742.112, jika saya mengarahkan ulang dengan header berikut:

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

Yang jika diikuti mengembalikan header berikut:

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 tidak akan mengalihkan, atau mengubah halaman sebelumnya, itu hanya akan melaporkan peringatan berikut di konsol:

Sumber daya diartikan sebagai Dokumen tetapi ditransfer dengan aplikasi / zip tipe MIME.

Prosesnya berfungsi dengan benar di Firefox, dan juga berfungsi dengan baik di Chrome jika saya membuka tab baru dan langsung menuju http://0.0.0.0:3000/files/download.zip. Apakah saya melakukan sesuatu yang salah, atau ini bug / kekhasan Chrome?

Ashley Williams
sumber

Jawaban:

168

Anda dapat menentukan atribut unduhan HTML5 di tag <a> Anda.

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

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

Roy Hyunjin Han
sumber
3
Atribut "unduh" tidak mendukung di yaitu atau browser lain. jika Anda memiliki pilihan lain tolong bantu saya
Renish Khunt
3
Itu memperbaiki Chrome, tetapi merusak browser lain. Ponsel Android saya tidak akan mengunduh dari tautan semacam itu.
Betty
38
mendesah. 'FIX' INI TIDAK BEKERJA UNTUK BROWSER PALING - hanya Chrome. Dan ini tahun 2016, jadi jangan berharap itu akan segera terjadi.
a20
2
Tidak membuat perbedaan di Chrome 2019
Michael Rogers
17
@all Ini 2035 (saya datang dari masa depan) dan tidak ada komputer untuk mendukung ini.
Ali Farhoudi
34

Di tajuk permintaan Anda, Anda telah mengirim Content-Type: text/htmlyang artinya Anda ingin menafsirkan respons sebagai HTML. Sekarang bahkan jika server mengirim Anda file PDF, browser Anda mencoba memahaminya sebagai HTML. Itulah masalahnya. Saya mencari tahu alasannya. :)

Saeed Neamati
sumber
Saya sudah mencoba mengirimnya karena Content-Type: application/ziptidak berhasil, masih mencoba memprosesnya sebagai 'Dokumen'. Mungkin juga patut menunjukkan bahwa URL zip dinamis di aplikasi saya, jadi tidak ada hubungannya dengan caching.
Ashley Williams
1
Terima kasih! Mungkinkah ada hubungannya dengan Chrome yang mengirim Accepttajuk permintaan seperti text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, mungkin? Saya benar-benar bingung di sini, saya benar-benar!
Ashley Williams
5
Tidak, di text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8sana ada bagian yang mengatakan bahwa Chrome menerima hampir semuanya ( */*).
Saeed Neamati
3
Apa yang kamu bicarakan? Tidak ada tajuk permintaan dalam pertanyaan. Keduanya adalah header respons.
doubleDown
1
Dan saya duduk di sini bertanya-tanya mengapa ini harus menjadi jawaban tetapi bukan komentar?
dasbor
24

Saya mengalami masalah ini ketika menyajikan file PDF (aplikasi tipe MIME / pdf) dan menyelesaikannya dengan mengatur header Content-Disposition, misalnya:

Content-Disposition: attachment; filename=foo.pdf

Semoga itu bisa membantu.

Evan
sumber
11
tetapi di mana harus menulis ini?
hud
4
@coder Anda menambahkan header seperti ini dari server web Anda. Tidak yakin apa yang Anda gunakan untuk itu, jadi sulit untuk memberikan info lebih lanjut. Bahasa atau kerangka apa yang Anda gunakan untuk server Anda?
Evan
7
Dapatkan ini di tajuk kami tetapi Chrome masih melempar peringatan
Adam Reis
nopes itu tidak memperbaiki apa pun di chrome Versi 76.0.3809.132 (Build Resmi) (64-bit) saya sudah memiliki header terpasang
Muhammad Omer Aslam
22

Saya sudah memperbaiki ini ... dengan hanya membuka tab baru.

Mengapa itu tidak berfungsi, saya tidak sepenuhnya yakin, tapi itu bisa ada hubungannya dengan bagaimana Chrome menangani beberapa unduhan pada satu halaman, mungkin mereka berpikir itu adalah spam dan mengabaikannya.

Ashley Williams
sumber
6
Apa maksud Anda "membuka tab baru" ??? Anda secara manual membuka jendela browser baru dan menempelkan URL unduhan di sana?
Tony R
2
Ya persis. Saya berasumsi itu adalah bug dalam kondisi aplikasi tab tertentu.
Ashley Williams
52
Saya tidak akan mengharapkan pengguna untuk membuka tab baru ... Dan saya juga tidak menemukan membuka tab untuk mengunduh file yang elegan.
Yassir Ennazk
24
@Joram et. Al. - membuka tab untuk unduhan (menggunakan target '_blank') - tidak menyelesaikan masalah, itu hanya mentransfer pesan peringatan konsol "Resource intrepreted as Document" ke tab baru. Menyapu di bawah karpet bukanlah solusi.
colm.anseo
1
Ini jelas tidak menyelesaikan jawaban asli. Serius ... Apa yang akan saya tempatkan di dokumen pengguna "salin url, buka tab baru, rekatkan url, ..."? Bisnis turun.
Stranded Kid
22

Saya tidak dapat menemukan penjelasan apa pun dari pesan itu sendiri. Inilah interpretasi saya.

Sejauh yang saya mengerti, Chrome mengharapkan beberapa materi yang dapat ditampilkan ( dokumen ), tetapi Chrome memperoleh sesuatu yang tidak dapat ditampilkan (atau sesuatu yang diperintahkan untuk tidak ditampilkan).

Ini adalah pertanyaan tentang bagaimana dokumen dideklarasikan pada tingkat halaman HTML di href(lihat downloadatribut dalam pesan Roy) dan bagaimana ia dideklarasikan di dalam jawaban server dengan cara HTTP header (khususnya Content-Disposition). Ini adalah masalah kontrak , yang bertentangan dengan harapan dan harapan.

Untuk melanjutkan perjalanan Evan, saya telah mengalaminya:

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

adalah hanya tidak konsisten dengan:

<a href='some.pdf'>

Chrome akan berteriak Resource ditafsirkan sebagai dokumen tetapi ditransfer ...

Sebenarnya, disposisi lampiran hanya berarti ini: browser tidak akan menafsirkan tautan, melainkan menyimpannya di suatu tempat untuk tujuan lain yang tersembunyi. Di sini di atas, downloadada yang hilang di samping href, atau Content-dispositionharus dihapus dari header. Itu tergantung pada apakah kita ingin browser membuat dokumen atau tidak.

Semoga ini membantu.

Champignac
sumber
9

Saya mengalami masalah yang sama hari ini dengan Versi Chrome 30.0.1599.66 dengan aplikasi node.js / express.js saya.

Header yang benar, mengungkapkan set dengan benar secara otomatis, ia bekerja di browser lain seperti yang ditunjukkan, menempatkan html 5 'download' atribut tidak tekad, apa yang lakukan tekad itu akan menjadi pengaturan lanjutan krom dan memeriksa kotak "Tanyakan lokasi penyimpanan setiap file sebelum mengunduh ".

Setelah itu tidak ada kesalahan "Sumberdaya ditafsirkan sebagai dokumen ...." dilaporkan seperti dalam judul masalah ini sehingga tampaknya kode server kami benar, itu adalah Chrome yang salah melaporkan kesalahan itu di konsol ketika diatur untuk menyimpan file ke lokasi secara otomatis.

JohnC
sumber
9

Saya memiliki masalah serupa ketika melakukan pengunduhan file melalui Javascript. Menambahkan atribut unduhan tidak membuat perbedaan tetapi menambahkan target = '_ blank' berhasil - Saya tidak lagi mendapatkan pesan konsol 'Sumberdaya diartikan sebagai Dokumen ...'.

Ini kode sederhana saya:

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

Saya belum mencobanya dengan HTML langsung tetapi akan berharap itu berfungsi.

Catatan saya menemukan bahwa Firefox mengharuskan tautan ditambahkan ke dokumen sedangkan Chrome akan bekerja tanpa itu.

Elliveny
sumber
4
hanya peringatan, target = '_blank' akan memicu mekanisme pencegahan popup IE 11 ...
RobM
4

Saya mengalami ini ketika saya menetapkan src = "image_url" di iframe. Tampaknya iframe mengartikannya sebagai dokumen tetapi tidak. Itu sebabnya ini menampilkan peringatan.

Carmela
sumber
bisakah Anda mengatakan kepada saya bagaimana Anda memperbaikinya? karena saya menghadapi masalah yang sama di sini ketika menggunakan iframe
Shikha thakur
Saya menggunakan data formulir: var photoData = new FormData(); dan kemudian mengatur properti contentType: falsedi permintaan ajax saya. Permintaan posting adalah: Content-Disposition: form-data;Dan tipe kontenContent-Type: text/html
Carmela
3

Saya memecahkan masalah dengan adding target="_blank"tautan. Dengan ini, chrome membuka tab baru dan memuat PDF tanpa peringatan bahkan dalam mode responsif.

med
sumber
Saya melakukan ini dan berhasil: window.open(href, '_blank');dan tab baru otomatis ditutup setelah pengunduhan.
Chad Richardson
1

Saya memiliki masalah ini dalam proyek situs web ASP. Menambahkan tajuk "Panjang Konten" menyebabkan unduhan mulai bekerja lagi di Chrome.

R. Salisbury
sumber
1

Masalah ini muncul kembali di versi Chrome 61. Tapi sepertinya sudah diperbaiki di Chrome 62.

Saya punya Aturan Rewrite seperti di bawah ini

RewriteRule ^/ShowGuide/?$ https://<website>/help.pdf [L,NC,R,QSA]

Dengan Chrome 61, PDF tidak terbuka, di konsol itu menampilkan pesan

"Resource interpreted as Document but transferred with MIME type application/pdf: "

Kami mencoba menambahkan tipe mime dalam aturan penulisan ulang seperti di bawah ini tetapi tidak membantu.

RewriteRule ^/ShowGuide/?$ https://<website>/help.pdf [L,NC,R,QSA, t:application/pdf]

Saya telah memperbarui Chrome saya ke versi 62 terbaru dan mulai menampilkan PDF lagi. Tapi pesannya masih ada di konsol.

Dengan semua browser lain, itu / sedang berfungsi dengan baik.

Asif Nowaj
sumber
1

Hanya berlari ke ini dan tidak ada informasi lain yang saya temukan membantu: itu adalah kesalahan bodoh: Saya mengirim output ke browser sebelum memulai unduhan file. Anehnya, saya tidak menemukan kesalahan yang membantu ditemukan (seperti "header sudah dikirim" dll.). Mudah-mudahan, ini menyimpan kesedihan orang lain!

pengguna6096790
sumber
0

Dalam kasus saya nama file terlalu panjang, dan mendapat kesalahan yang sama. Setelah dipersingkat di bawah 200 karakter bekerja dengan baik. (batasnya mungkin 250?)

holdfenytolvaj
sumber
0

Saya mendapatkan kesalahan ini karena saya melayani dari sistem file saya. Setelah saya mulai dengan chrome server http bisa mengetahuinya.

Remydib
sumber
0

Saya mengalami masalah yang sama dengan pengelola unduhan yang saya buat. Masalahnya saya melibatkan nama file yang terlalu panjang dan ekstensi terpotong.

Contoh: Nama File: Protokol Organisasi dan Hal-Hal Lain yang Penting.pd

<?php
  header("Content-Disposition: attachment; filename=$File_Name");
?>

Solusi: Tingkatkan bidang database MySQL ke 255 untuk menyimpan nama file, dan lakukan pemeriksaan panjang sebelum menyimpan gumpalan. Jika panjang> 255 pangkas menjadi 250 dan tambahkan ekstensi file.

eradima
sumber
0

Coba kode di bawah ini dan saya harap ini akan berhasil untuk Anda.

var Interval = setInterval(function () {
                if (ReportViewer) {
                    ReportViewer.prototype.PrintReport = function () {
                        switch (this.defaultPrintFormat) {
                            case "Default":
                                this.DefaultPrint();
                                break;
                            case "PDF":
                                this.PrintAs("PDF");
                                previewFrame = document.getElementById(this.previewFrameID);
                                previewFrame.onload = function () { previewFrame.contentDocument.execCommand("print", true, null); }
                                break;
                        }
                    };
                    clearInterval(Interval);
                }
            }, 1000);
Faraz
sumber
0

Saya menghadapi ini hari ini, dan masalah saya adalah bahwa Content-Dispositiontag saya salah diatur. Sepertinya untuk keduanya pdf& application/x-zip-compressed, Anda seharusnya mengaturnya inlinealih-alih attachment.

Jadi untuk mengatur tajuk Anda, kode Java akan terlihat seperti ini:

...
String fileName = "myFileName.zip";
String contentDisposition = "attachment";
if ("application/pdf".equals(contentType)
    || "application/x-zip-compressed".equals(contentType)) {
    contentDisposition = "inline";
}
response.addHeader("Content-Disposition", contentDisposition + "; filename=\"" + fileName + "\"");
...
Olivier B.
sumber