मेरे पास एक लिंक है जो एक PHP स्क्रिप्ट पर जाता है जो एक CSV फ़ाइल को डाउनलोड और सहेजने के लिए उत्पन्न करता है। मैं प्रतिक्रिया में सामग्री-विस्थापन और सामग्री-प्रकार शीर्षलेख उत्पन्न करता हूं। प्रत्येक ब्राउज़र क्रोम (v19) के लिए को छोड़कर फ़ाइल ठीक डाउनलोड करता है।क्रोम एक फ़ाइल अनुलग्नक को एक दस्तावेज़ के रूप में गलत व्याख्या कर रहा है
लिंक कुछ इस तरह है:
http://hostname.com/controller/action/export
हेडर उस अनुरोध से लौटे हैं:
Cache-control:no-cache, must-revalidate
Connection:Keep-Alive
Content-Disposition:attachment; filename=2012-03-14.csv
Content-Encoding:gzip
Content-Length:521
Content-Type:application/vnd.ms-excel
Date:Thu, 15 Mar 2012 05:17:55 GMT
Expires:Mon, 26 Jul 1997 05:00:00 GMT
Keep-Alive:timeout=5, max=92
P3P:CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Pragma:no-cache
Server:Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8i mod_autoindex_color PHP/5.2.9
Vary:Accept-Encoding
X-Powered-By:PHP/5.2.9
क्रोम डेवलपर्स उपकरण पता चलता है कि नेटवर्क कनेक्शन Canceled
और कंसोल विंडो था निम्न त्रुटि दिखाता है:
Resource interpreted as Document but transferred with MIME type application/vnd.ms-excel:
मैंने सामग्री-प्रकार के लिए अलग-अलग मानों का उपयोग करने का प्रयास किया है, मैंने कैश-कंट्रोल और कंटेंट-टाइप हेडर बंद कर दिए हैं। मैंने जावास्क्रिप्ट location.href=
, <a>
टैग, <form action="POST">
का उपयोग करके परीक्षण किया है, क्रोम को वास्तव में फ़ाइल डाउनलोड करने का प्रयास करने के लिए Gzip संपीड़न और कई अन्य विधियों को बंद कर दिया है।
हर अन्य ब्राउज़र फ़ाइल को ठीक से डाउनलोड करता है, इसलिए मेरा सवाल यह है: क्रोम को अटैचमेंट के बजाय डिस्प्ले के लिए "दस्तावेज़" के रूप में अनुरोध की व्याख्या करने का कारण क्या है? क्या कोई अन्य शीर्षलेख है जो मैं याद कर रहा हूं या सूची में एक शीर्षलेख है जो इसे भ्रमित कर रहा है?
संपादित करें: यहाँ, के रूप में अनुरोध PHP कोड है यह थोड़ा लंबा है, हालांकि:
function renderHeaders($filename = null) {
header("Content-Type: application/vnd.ms-excel");
header("Cache-Control: public, must-revalidate, max-age=0");
if (is_string($filename)) {
$this->setFilename($filename);
}
if ($this->filename === null) {
$this->filename = 'Data.csv';
}
if ($this->filename) {
header("Content-disposition: attachment; filename=".$this->filename);
}
}
function render($outputHeaders = true, $to_encoding = null, $from_encoding = "auto") {
if ($outputHeaders) {
$this->renderHeaders();
}
if ($this->_tmpFile) {
rewind($this->buffer);
$output = '';
while (!feof($this->buffer)) {
$output .= fread($this->buffer, 8192);
}
fclose($this->buffer);
} else {
rewind($this->buffer);
$output = stream_get_contents($this->buffer);
}
// get around excel bug (http://support.microsoft.com/kb/323626/)
if (substr($output,0,2) == 'ID') {
$pos = strpos($output, $this->delimiter);
if ($pos === false) {
$pos = strpos($output, "\n");
}
if ($pos !== false) {
$output = $this->enclosure . substr($output, 0, $pos) . $this->enclosure . substr($output, $pos);
}
}
if ($to_encoding) {
$output = mb_convert_encoding($output, $to_encoding, $from_encoding);
}
$this->clear();
return $this->output($output);
}
आप पोस्ट कर सकते हैं अपने php कोड है जो हेडर –
मुझे लगता है कि आप एक बग दर्ज कर सकते हैं उत्पन्न करता है) –
मैं अगर यह यकीन नहीं है कोई फर्क नहीं पड़ता, लेकिन 'कंटेंट-ट्रांसफर-एन्कोडिंग: बाइनरी' भेजने के बारे में क्या? –