संसाधन को दस्तावेज़ के रूप में व्याख्या किया गया लेकिन MIME प्रकार के अनुप्रयोग / ज़िप के साथ स्थानांतरित किया गया


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 प्रकार के अनुप्रयोग / ज़िप के साथ स्थानांतरित किया गया।

फ़ायरफ़ॉक्स में प्रक्रिया सही ढंग से काम करती है, और यदि मैं एक नया टैब खोलता हूं और सीधे क्रोम में जाता हूं, तो भी क्रोम में ठीक काम करता है http://0.0.0.0:3000/files/download.zip। क्या मैं कुछ गलत कर रहा हूं, या यह क्रोम का बग / क्विक है?


जवाबों:


168

आप अपने <a> टैग में HTML5 डाउनलोड विशेषता निर्दिष्ट कर सकते हैं ।

<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 फ़ोन उस तरह के लिंक से डाउनलोड नहीं होंगे।
बेटी

38
आह। यह 'FIX' सबसे ज्यादा क्रोम के लिए काम नहीं करता है - केवल क्रोम। और यह 2016 है, इसलिए कभी भी जल्द ही इसकी उम्मीद न करें।
a20

2
क्रोम 2019 में कोई फर्क नहीं पड़ता
माइकल रोजर्स

16
@ यह 2035 है (मैं भविष्य से आया हूं) और इसका समर्थन करने के लिए कोई कंप्यूटर नहीं है।
अली फरहौदी

34

आपके अनुरोध शीर्षलेख में, आपने भेजा है Content-Type: text/htmlजिसका अर्थ है कि आप प्रतिक्रिया को HTML के रूप में व्याख्या करना चाहते हैं। अब अगर सर्वर भी आपको पीडीएफ फाइलें भेजता है, तो आपका ब्राउज़र इसे HTML समझने की कोशिश करता है। यही समस्या है। मैं यह देखने के लिए खोज कर रहा हूं कि इसका क्या कारण हो सकता है। :)


मैंने इसे Content-Type: application/zipबिना किसी लाभ के भेजने की कोशिश की है , फिर भी इसे 'दस्तावेज़' के रूप में संसाधित करने की कोशिश करता है। यह शायद यह भी इंगित करने योग्य है कि मेरे ऐप में ज़िप URL गतिशील है, इसलिए इसका कैशिंग से कोई लेना-देना नहीं है।
एशले विलियम्स

1
धन्यवाद! क्या ऐसा हो सकता है कि Chrome को Acceptअनुरोध शीर्षलेख भेजने के साथ कुछ करना है text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, शायद? मैं बिल्कुल यहाँ हूँ, मैं वास्तव में हूँ!
एशले विलियम्स

5
नहीं, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8इसमें एक हिस्सा है जो कहता है कि क्रोम लगभग सब कुछ ( */*) स्वीकार करता है ।
सईद नेमाटी

3
तुम्हारी किस बारे में बोलने की इच्छा थी? प्रश्न में कोई अनुरोध शीर्षलेख नहीं है। ये दोनों ही रिस्पॉन्स हेडर हैं।
डबलडाउन

1
और मैं यहाँ सोच कर बैठा हूँ कि यह उत्तर क्यों होना चाहिए लेकिन टिप्पणी नहीं?
डैशबोर्ड

24

पीडीएफ फाइल (MIME टाइप एप्लिकेशन / पीडीएफ़) परोसते समय मैंने इस समस्या का अनुभव किया और सामग्री-विवाद शीर्षक सेट करके इसे हल किया:

Content-Disposition: attachment; filename=foo.pdf

उम्मीद है की वो मदद करदे।


11
लेकिन यह कहां लिखा जाए?
HUD

4
@ कोडर आप अपने वेबसर्वर से इस तरह हेडर जोड़ते हैं। निश्चित नहीं है कि आप उसके लिए क्या उपयोग कर रहे हैं, इसलिए अधिक जानकारी देना कठिन है। आप अपने सर्वर के लिए किस भाषा या ढांचे का उपयोग कर रहे हैं?
इवान

7
हमारे हेडर में यह है लेकिन क्रोम अभी भी चेतावनी फेंकता है
एडम रीस

नोड्स यह क्रोम पर कुछ भी ठीक नहीं करता है संस्करण 76.0.3809.132 (आधिकारिक निर्माण) (64-बिट) मेरे पास पहले से ही हेडर संलग्न हैं
मुहम्मद ओमर असलम

22

मैंने इसे ठीक कर लिया है ... बस एक नया टैब खोलकर।

यह काम क्यों नहीं कर रहा था मैं पूरी तरह से निश्चित नहीं हूं, लेकिन यह कुछ ऐसा हो सकता है कि क्रोम एक पृष्ठ पर कई डाउनलोड के साथ कैसे व्यवहार करता है, शायद यह सोचा कि वे स्पैम थे और बस उन्हें अनदेखा कर दिया।


6
आपका क्या मतलब है "आपने एक नया टैब खोला" ??? आपने मैन्युअल रूप से एक नई ब्राउज़र विंडो खोली है और उसमें डाउनलोड यूआरएल पेस्ट किया है?
टोनी आर

2
हाँ बिल्कुल। मैंने मान लिया कि यह विशेष टैब के एप्लिकेशन-स्टेट में एक बग था।
एशले विलियम्स

52
मैं उपयोगकर्ता से एक नया टैब खोलने की उम्मीद नहीं करूंगा ... और मुझे एक फ़ाइल को सुरुचिपूर्ण ढंग से डाउनलोड करने के लिए खोलने की ज़रूरत नहीं है।
यासिर एनाज़क

24
@ जोराम एट। अल। - डाउनलोड के लिए एक टैब खोलना (लक्ष्य '_blank' का उपयोग करके) - समस्या को हल नहीं करता है, यह सिर्फ "संसाधन के रूप में व्याख्या किए गए दस्तावेज़" कंसोल चेतावनी संदेश को एक नए टैब में स्थानांतरित करता है। गलीचा के नीचे झूलना समाधान नहीं है।
colm.anseo

1
यह स्पष्ट रूप से मूल उत्तर को हल नहीं करता है। गंभीरता से ... मैं उपयोगकर्ता डॉक में क्या डालूंगा "यूआरएल कॉपी करें, एक नया टैब खोलें, यूआरएल पेस्ट करें, ..."? व्यापार नीचे।
फंसे हुए बच्चे

22

मुझे कहीं भी संदेश का केवल स्पष्टीकरण ही नहीं मिला। यहाँ मेरी व्याख्या है।

जहां तक ​​मैं समझता हूं, क्रोम कुछ ऐसी सामग्री की उम्मीद कर रहा था जो संभवतः इसे (एक दस्तावेज ) प्रदर्शित कर सकती थी , लेकिन इसे कुछ ऐसा मिला जिसे यह प्रदर्शित नहीं कर सकता था (या ऐसा कुछ जिसे प्रदर्शित नहीं किया गया था)।

यह दोनों का एक प्रश्न है कि दस्तावेज़ को HTML पेज स्तर पर कैसे घोषित किया गया था href( downloadरॉय के संदेश में विशेषता देखें ) और यह HTTP हेडर (विशेष रूप से Content-Disposition) के माध्यम से सर्वर के उत्तर के भीतर कैसे घोषित किया गया है । यह अनुबंध का प्रश्न है , आशा और अपेक्षा के विपरीत है।

इवान के रास्ते पर जारी रखने के लिए, मैंने अनुभव किया है कि:

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

के साथ बस असंगत है:

<a href='some.pdf'>

Chrome दस्तावेज़ के रूप में व्याख्या किए गए संसाधन का रोना रोएगा ...

दरअसल, अटैचमेंट डिस्पोजल का बस यही मतलब है: ब्राउजर लिंक की व्याख्या नहीं करेगा, बल्कि इसे अन्य-छिपे उद्देश्यों के लिए कहीं स्टोर करेगा। यहां ऊपर, या तो downloadबगल में गायब है href, या Content-dispositionहेडर से हटाया जाना चाहिए। यह इस बात पर निर्भर करता है कि हम ब्राउज़र को दस्तावेज़ रेंडर करना चाहते हैं या नहीं।

उम्मीद है की यह मदद करेगा।


9

मुझे अपने नोड.js / express.js एप्लिकेशन के साथ क्रोम संस्करण 30.0.1599.66 के साथ आज भी इसी मुद्दे का सामना करना पड़ा।

हेडर हैं , सही व्यक्त सेट उन्हें ठीक से स्वचालित रूप से, यह अन्य ब्राउज़रों के रूप में दर्शाया में काम करता है डाल एचटीएमएल 5 'डाउनलोड' विशेषता नहीं संकल्प, क्या करता है किया संकल्प यह क्रोम उन्नत सेटिंग्स में जाकर और जाँच कर रहा है "पूछो जहां बचाने के लिए डाउनलोड करने से पहले प्रत्येक फ़ाइल "।

उसके बाद "संसाधन के रूप में व्याख्या की गई कोई दस्तावेज़ नहीं था ...." इस मुद्दे के शीर्षक के रूप में रिपोर्ट की गई त्रुटि इसलिए यह प्रतीत होता है कि हमारा सर्वर कोड सही है, यह क्रोम है जो कंसोल में उस त्रुटि की गलत रिपोर्टिंग कर रहा है जब इसे सहेजने के लिए सेट किया गया है स्वचालित रूप से किसी स्थान पर फ़ाइलें।


9

जावास्क्रिप्ट के माध्यम से एक फ़ाइल डाउनलोड करते समय मेरे पास एक समान मुद्दा था। डाउनलोड विशेषता जोड़ने से कोई फ़र्क नहीं पड़ा लेकिन लक्ष्य जोड़ना = '_ रिक्त' किया - मुझे अब 'संसाधन के रूप में दस्तावेज़ के रूप में व्याख्या की गई ...' कंसोल संदेश नहीं मिला।

यहाँ मेरा सरल कोड है:

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

मैंने इसे प्रत्यक्ष HTML के साथ आज़माया नहीं है, लेकिन यह काम करने की उम्मीद करेगा।

नोट मुझे पता चला कि फ़ायरफ़ॉक्स को दस्तावेज़ में लिंक करने की आवश्यकता है जबकि क्रोम इसके बिना काम करेगा।


4
सिर्फ एक चेतावनी, एक लक्ष्य = '_blank' IE 11 के पॉपअप रोकथाम तंत्र को ट्रिगर करेगा ...
RobM

4

मुझे इसका सामना करना पड़ा जब मैंने एक iframe में src = "image_url" असाइन किया। ऐसा लगता है कि iframe इसे एक दस्तावेज के रूप में व्याख्या करता है लेकिन ऐसा नहीं है। इसलिए यह एक चेतावनी प्रदर्शित करता है।


क्या आप मुझे बता सकते हैं कि आपने इसे कैसे तय किया? के रूप में यहाँ एक ही समस्या का सामना करते हुए एक iframe का उपयोग करते समय
Shikha thakur

मैंने फॉर्म डेटा का उपयोग किया: var photoData = new FormData(); और फिर संपत्ति contentType: falseको मेरे ऐजैक्स अनुरोध में सेट किया । पोस्ट अनुरोध होगा: Content-Disposition: form-data;और सामग्री-प्रकारContent-Type: text/html
कार्मेला

3

मैंने adding target="_blank"लिंक द्वारा समस्या को हल किया । इसके साथ, क्रोम एक नया टैब खोलता है और उत्तरदायी मोड में भी चेतावनी के बिना पीडीएफ को लोड करता है।


मैंने यह किया और यह काम किया: window.open(href, '_blank');और नया टैब ऑटो डाउनलोड के बाद बंद हो गया।
चाड रिचर्डसन

1

मैं एक ASP वेब साइट प्रोजेक्ट में यह समस्या थी। क्रोम में फिर से काम करना शुरू करने के लिए "कंटेंट-लेंथ" हेडर को जोड़ने के कारण डाउनलोड को जोड़ा गया।


1

यह समस्या Chrome 61 संस्करण में पुनः दिखाई दी थी। लेकिन ऐसा लगता है कि यह क्रोम 62 पर तय किया गया है।

मैं नीचे की तरह एक RewriteRule है

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

क्रोम 61 के साथ, पीडीएफ नहीं खुल रहा था, कंसोल में यह संदेश दिखा रहा था

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

हमने नीचे के रूप में फिर से लिखना नियम में माइम प्रकार जोड़ने की कोशिश की लेकिन यह मदद नहीं की।

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

मैंने अपने क्रोम को नवीनतम 62 संस्करण में अपडेट किया है और इसने पीडीएफ को फिर से दिखाना शुरू कर दिया है। लेकिन संदेश अभी भी कंसोल में है।

अन्य सभी ब्राउज़रों के साथ, यह ठीक काम कर रहा था।


1

बस इस में भाग गया और कोई भी अन्य जानकारी जो मुझे नहीं मिल सकी: यह एक बेवकूफ त्रुटि थी: मैं फ़ाइल डाउनलोड शुरू करने से पहले ब्राउज़र को आउटपुट भेज रहा था। हैरानी की बात है, मुझे कोई सहायक त्रुटि नहीं मिली (जैसे "हेडर पहले से ही भेजे गए आदि")। उम्मीद है, यह किसी और को कुछ दुःख बचाता है!


0

मेरे मामले में फ़ाइल का नाम बहुत लंबा था, और उसे वही त्रुटि मिली। एक बार 200 वर्णों से नीचे छोटा ठीक काम किया। (सीमा 250 हो सकती है?)


0

मुझे यह त्रुटि मिली क्योंकि मैं अपने फ़ाइल सिस्टम से सेवा कर रहा था। एक बार जब मैंने http सर्वर क्रोम के साथ शुरुआत की तो यह पता लगा सकता है।


0

मैं एक डाउनलोड प्रबंधक मैं बनाया के साथ एक ही परेशानी का सामना कर रहा था। समस्या मैं फ़ाइल नाम बहुत लंबे समय से शामिल किया जा रहा था और विस्तार बंद किया जा रहा है।

उदाहरण: फ़ाइल का नाम: संगठनात्मक प्रोटोकॉल और अन्य चीजें जो महत्वपूर्ण हैं। पीडी

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

समाधान: फ़ाइल नाम को संग्रहीत करने के लिए MySQL डेटाबेस फ़ील्ड को 255 तक बढ़ाया, और बूँद को बचाने से पहले एक लंबाई की जाँच की। यदि लंबाई> 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आप इसे inlineइसके बजाय सेट करना चाहते हैं attachment

तो अपने हेडर को सेट करने के लिए, जावा कोड इस तरह दिखेगा:

...
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 + "\"");
...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.