ทรัพยากรตีความว่าเป็นเอกสาร แต่ถ่ายโอนด้วย MIME type application / zip


199

ด้วย Chrome 12.0.742.112 ถ้าฉันเปลี่ยนเส้นทางด้วยส่วนหัวต่อไปนี้:

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

ซึ่งถ้าติดตามจะส่งคืนส่วนหัวต่อไปนี้:

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 จะไม่เปลี่ยนเส้นทางหรือเปลี่ยนหน้าก่อนหน้ามันจะรายงานคำเตือนต่อไปนี้ในคอนโซล:

ทรัพยากรตีความว่าเป็นเอกสาร แต่ถ่ายโอนด้วย MIME type application / zip

กระบวนการทำงานอย่างถูกต้องใน Firefox และยังทำงานได้ดีใน Chrome http://0.0.0.0:3000/files/download.zipถ้าฉันเปิดแท็บใหม่และไป ฉันกำลังทำอะไรผิดหรือเป็นข้อผิดพลาดของ Chrome


คำตอบ:


168

คุณสามารถระบุแอตทริบิวต์การดาวน์โหลด HTML5 ในแท็ก <a> ของคุณ

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

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


3
แอตทริบิวต์ "ดาวน์โหลด" ไม่รองรับเช่นเบราว์เซอร์อื่น ๆ หากคุณมีตัวเลือกอื่นโปรดช่วยฉันด้วย
Renish Khunt

3
ที่แก้ไข Chrome แต่แบ่งเบราว์เซอร์อื่น ๆ โทรศัพท์ Android ของฉันจะไม่ดาวน์โหลดจากลิงค์ประเภทนั้น
Betty

38
ถอนหายใจ 'การแก้ไข' นี้ไม่ทำงานสำหรับเบราว์เซอร์ส่วนใหญ่ - เฉพาะ Chrome และเป็นปี 2559 ดังนั้นอย่าคาดหวังว่าจะได้ในเร็ว ๆ นี้เช่นกัน
a20

2
ไม่ได้สร้างความแตกต่างใน Chrome 2019
Michael Rogers

16
@ ทั้งหมดมันคือ 2035 (ฉันมาจากอนาคต) และไม่มีคอมพิวเตอร์ที่จะสนับสนุนสิ่งนี้
Ali Farhoudi

34

ในส่วนหัวคำขอของคุณคุณได้ส่งContent-Type: text/htmlซึ่งหมายความว่าคุณต้องการตีความการตอบสนองเป็น HTML ตอนนี้หากเซิร์ฟเวอร์ส่งไฟล์ PDF ถึงคุณเบราว์เซอร์ของคุณจะพยายามเข้าใจว่าเป็น HTML นั่นคือปัญหา. ฉันกำลังค้นหาเพื่อดูว่ามีเหตุผลอะไรบ้าง :)


ฉันพยายามส่งมันContent-Type: application/zipโดยไม่มีประโยชน์มันยังคงพยายามประมวลผลเป็น 'เอกสาร' อาจเป็นไปได้ที่จะชี้ให้เห็นว่า URL ของซิปเป็นแบบไดนามิกในแอปของฉันดังนั้นจึงไม่มีอะไรเกี่ยวข้องกับการแคช
Ashley Williams

1
ขอบคุณ! เป็นไปได้ไหมที่ Chrome จะส่งAcceptส่วนหัวของคำขอไปเป็นtext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8บางที ฉันนิ่งงันอย่างแน่นอนที่นี่ฉันเป็นจริง!
Ashley Williams

5
ไม่มีtext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8บางส่วนที่บอกว่า Chrome ยอมรับเกือบทุกอย่าง ( */*)
Saeed Neamati

3
คุณกำลังพูดเรื่องอะไร ไม่มีส่วนหัวคำขอในคำถาม ทั้งคู่เป็นส่วนหัวการตอบสนอง
doubleDown

1
และฉันกำลังนั่งอยู่ที่นี่สงสัยว่าทำไมสิ่งนี้จึงควรเป็นคำตอบ แต่ไม่ใช่ความคิดเห็น
แดชบอร์ด

24

ฉันประสบปัญหานี้เมื่อแสดงไฟล์ PDF (แอปพลิเคชันประเภท MIME / pdf) และแก้ไขได้โดยการตั้งค่าส่วนหัวการจัดการเนื้อหาเช่น:

Content-Disposition: attachment; filename=foo.pdf

หวังว่าจะช่วย


11
แต่จะเขียนตรงไหนดี
ฮัด

4
@coder คุณเพิ่มส่วนหัวเช่นนี้จากเว็บเซิร์ฟเวอร์ของคุณ ไม่แน่ใจว่าสิ่งที่คุณใช้อยู่นั้นเป็นเรื่องยากที่จะให้ข้อมูลเพิ่มเติม คุณใช้ภาษาหรือกรอบภาษาใดในเซิร์ฟเวอร์ของคุณ
Evan

7
มีส่วนนี้ไว้ในส่วนหัวของเรา แต่ Chrome ยังคงโยนคำเตือน
Adam Reis

ไม่ได้แก้ไขสิ่งใดบน Chrome รุ่น76.0.3809.132 (รุ่นเป็นทางการ) (64 บิต)ฉันได้ติดตั้งส่วนหัวไว้แล้ว
Muhammad Omer Aslam

22

ฉันได้แก้ไขสิ่งนี้แล้ว ... เพียงแค่เปิดแท็บใหม่

ทำไมมันไม่ทำงานฉันไม่แน่ใจทั้งหมด แต่อาจมีบางอย่างเกี่ยวกับวิธีที่ Chrome จัดการกับการดาวน์โหลดหลายครั้งบนหน้าเว็บบางทีอาจคิดว่าพวกเขาเป็นสแปมและไม่สนใจเลย


6
คุณหมายความว่าคุณ "เปิดแท็บใหม่" ??? คุณเปิดหน้าต่างเบราว์เซอร์ใหม่ด้วยตนเองและวาง URL การดาวน์โหลดไว้ที่นั่นหรือไม่
Tony R

2
ใช่แล้ว ฉันคิดว่ามันเป็นข้อผิดพลาดในสถานะแอพพลิเคชั่นของแท็บนั้น ๆ
แอชลีย์วิลเลียมส์

52
ฉันไม่คาดหวังให้ผู้ใช้เปิดแท็บใหม่ ... และฉันไม่พบว่าการเปิดแท็บใหม่เพื่อดาวน์โหลดไฟล์ที่สวยงามเช่นกัน
Yassir Ennazk

24
@Joram และ อัล - การเปิดแท็บสำหรับดาวน์โหลด (โดยใช้เป้าหมาย '_blank') - ไม่สามารถแก้ปัญหาได้เพียงแค่โอนข้อความเตือนคอนโซล "Resource intrepreted as Document" ไปยังแท็บใหม่ การกวาดใต้พรมไม่ใช่วิธีแก้ปัญหา
colm.anseo

1
ชัดเจนไม่ได้แก้คำตอบเดิม อย่างจริงจัง ... ฉันจะใส่อะไรในเอกสารผู้ใช้ "คัดลอก URL เปิดแท็บใหม่วาง URL ... " ธุรกิจตกต่ำ
Kid Stranded

22

ฉันไม่สามารถหาคำอธิบายของข้อความได้จากทุกที่ นี่คือการตีความของฉัน

เท่าที่ฉันเข้าใจ Chrome คาดหวังว่าจะมีวัสดุบางอย่างที่สามารถแสดงได้ ( เอกสาร ) แต่ได้รับสิ่งที่ไม่สามารถแสดงได้ (หรือบางอย่างที่บอกว่าไม่ให้แสดง)

นี่เป็นคำถามที่ว่าเอกสารถูกประกาศในระดับเพจ HTML ในhref(ดูdownloadแอตทริบิวต์ในข้อความของ Roy) และวิธีการประกาศภายในคำตอบของเซิร์ฟเวอร์โดยใช้ส่วนหัว HTTP (โดยเฉพาะContent-Disposition) นี่คือคำถามของสัญญาเมื่อเทียบกับความหวังและความคาดหวัง

เพื่อดำเนินการต่อในทางของ Evan ฉันพบว่า:

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

เป็นเพียงที่ไม่สอดคล้องกันด้วย:

<a href='some.pdf'>

Chrome จะร้องไห้ทรัพยากรตีความว่าเป็นเอกสาร แต่ถูกโอน ...

ที่จริงแล้วการจัดการไฟล์แนบหมายถึงสิ่งนี้: เบราว์เซอร์จะไม่ตีความลิงก์ แต่จะเก็บไว้ที่อื่นเพื่อซ่อนตัว - ที่นี่ด้านบนอาจdownloadหายไปด้านข้างhrefหรือContent-dispositionต้องถูกลบออกจากส่วนหัว ขึ้นอยู่กับว่าเราต้องการให้เบราว์เซอร์แสดงเอกสารหรือไม่

หวังว่านี่จะช่วยได้


9

ฉันพบปัญหาเดียวกันนี้ในวันนี้ด้วย Chrome เวอร์ชัน 30.0.1599.66 พร้อมกับแอปพลิเคชัน node.js / express.js ของฉัน

ส่วนหัวมีความถูกต้องแสดงชุดได้อย่างถูกต้องโดยอัตโนมัติจะทำงานในเบราว์เซอร์อื่น ๆ ตามที่ระบุไว้วาง HTML 5 'ดาวน์โหลด' แอตทริบิวต์ไม่สามารถแก้ไขสิ่งที่ไม่ได้แก้ปัญหาได้เป็นไปในการตั้งค่าขั้นสูงโครเมี่ยมและการตรวจสอบช่อง "สอบถามที่เก็บ แต่ละไฟล์ก่อนดาวน์โหลด "

หลังจากนั้นไม่มีการรายงานข้อผิดพลาด "ทรัพยากรตีความว่าเป็นเอกสาร .... " ในชื่อของปัญหานี้ดังนั้นจึงปรากฏว่ารหัสเซิร์ฟเวอร์ของเราถูกต้อง Chrome คือการรายงานข้อผิดพลาดนั้นในคอนโซลเมื่อตั้งค่าให้บันทึกอย่างไม่ถูกต้อง ไฟล์ไปยังตำแหน่งโดยอัตโนมัติ


9

ฉันมีปัญหาที่คล้ายกันเมื่อทำการดาวน์โหลดไฟล์ผ่าน Javascript การเพิ่มแอททริบิวต์การดาวน์โหลดไม่มีความแตกต่าง แต่เพิ่ม target = '_ blank' ได้ - ฉันไม่ได้รับข้อความคอนโซล 'ทรัพยากรตีความว่าเป็นเอกสาร ... '

นี่คือรหัสง่าย ๆ ของฉัน:

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

ฉันไม่ได้ลองด้วย Direct HTML แต่คาดว่ามันจะใช้ได้

หมายเหตุฉันค้นพบว่า Firefox ต้องการลิงค์เพื่อผนวกเข้ากับเอกสารในขณะที่ Chrome จะทำงานไม่ได้


4
เพียงคำเตือนเป้าหมาย = '_blank' จะกระตุ้นกลไกป้องกันป๊อปอัปของ IE 11 ...
23419

4

ฉันพบสิ่งนี้เมื่อฉันมอบหมาย src = "image_url" ใน iframe ดูเหมือนว่า iframe ตีความว่าเป็นเอกสาร แต่ไม่ใช่ นั่นเป็นเหตุผลที่มันแสดงคำเตือน


คุณช่วยบอกฉันทีว่าคุณซ่อมมันได้ยังไง? ฉันกำลังเผชิญกับปัญหาเดียวกันที่นี่เมื่อใช้ iframe
Shikha thakur

ฉันใช้ข้อมูลฟอร์ม: var photoData = new FormData(); จากนั้นตั้งค่าคุณสมบัติ contentType: falseในคำขอ ajax ของฉัน คำขอโพสต์จะเป็น: Content-Disposition: form-data;และประเภทเนื้อหาContent-Type: text/html
Carmela

3

ฉันแก้ไขปัญหาโดยadding target="_blank"ไปที่ลิงก์ ด้วยวิธีนี้ Chrome จะเปิดแท็บใหม่และโหลด PDF โดยไม่มีการเตือนแม้ในโหมดตอบสนอง


ฉันทำสิ่งนี้และใช้งานได้: window.open(href, '_blank');และแท็บใหม่จะปิดอัตโนมัติหลังจากการดาวน์โหลด
Chad Richardson

1

ฉันมีปัญหานี้ในโครงการเว็บไซต์ ASP การเพิ่มส่วนหัว "ความยาวเนื้อหา" ทำให้การดาวน์โหลดเริ่มทำงานอีกครั้งใน Chrome


1

ปัญหานี้ปรากฏขึ้นอีกครั้งในรุ่น Chrome 61 แต่ดูเหมือนว่าจะได้รับการแก้ไขที่ Chrome 62

ฉันมี RewriteRule เหมือนด้านล่าง

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

ด้วย Chrome 61 ไฟล์ PDF ไม่ได้เปิดอยู่ในคอนโซลจะแสดงข้อความ

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

เราพยายามเพิ่มประเภท mime ในกฎการเขียนซ้ำด้านล่าง แต่มันไม่ได้ช่วย

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

ฉันได้อัปเดต Chrome เป็นรุ่น 62 แล้วและเริ่มแสดง PDF อีกครั้ง แต่ข้อความยังคงอยู่ในคอนโซล

สำหรับเบราว์เซอร์อื่น ๆ ทั้งหมดมันเป็น / ทำงานได้ดี


1

เพิ่งพบเจอข้อมูลนี้และไม่มีข้อมูลอื่นที่ฉันสามารถช่วยได้: มันเป็นข้อผิดพลาดโง่ ๆ : ฉันกำลังส่งเอาต์พุตไปยังเบราว์เซอร์ก่อนที่จะเริ่มดาวน์โหลดไฟล์ น่าแปลกที่ฉันไม่พบข้อผิดพลาดที่เป็นประโยชน์ (เช่น "ส่วนหัวที่ส่งไปแล้ว" เป็นต้น) หวังว่านี่จะช่วยคนอื่นให้เศร้าโศกบ้าง!


0

ในกรณีของฉันชื่อไฟล์ยาวเกินไปและได้รับข้อผิดพลาดเดียวกัน เมื่อสั้นลงต่ำกว่า 200 ตัวอักษรทำงานได้ดี (ขีด จำกัด อาจเท่ากับ 250)


0

ฉันได้รับข้อผิดพลาดนี้เนื่องจากฉันกำลังแสดงผลจากระบบไฟล์ของฉัน เมื่อฉันเริ่มต้นด้วยเซิร์ฟเวอร์ HTTP chrome สามารถคิดออก


0

ฉันประสบปัญหาเดียวกันกับตัวจัดการดาวน์โหลดที่ฉันสร้างขึ้น ปัญหาที่ฉันเกี่ยวข้องกับชื่อไฟล์นั้นยาวเกินไปและส่วนขยายถูกตัดออก

ตัวอย่าง: ชื่อไฟล์: โปรโตคอลองค์กรและสิ่งอื่น ๆ ที่สำคัญ. pd

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

วิธีแก้ไข: เพิ่มฟิลด์ฐานข้อมูล MySQL เป็น 255 เพื่อจัดเก็บชื่อไฟล์และทำการตรวจสอบความยาวก่อนบันทึก blob หากความยาว> 255 ตัดลงเหลือ 250 และเพิ่มนามสกุลไฟล์


0

ลองรหัสด้านล่างและฉันหวังว่าจะได้ผลสำหรับคุณ

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

0

ฉันพบสิ่งนี้ในวันนี้และปัญหาของฉันContent-Dispositionคือแท็กของฉันตั้งค่าไว้ไม่ถูกต้อง ดูเหมือนว่าสำหรับทั้งสองpdfและapplication/x-zip-compressedคุณควรจะตั้งค่าให้แทนinlineattachment

ดังนั้นในการตั้งค่าส่วนหัวของคุณโค้ด Java จะมีลักษณะเช่นนี้:

...
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 + "\"");
...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.