2012-03-15 9 views
11

मेरे पास एक लिंक है जो एक 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); 
} 
+0

आप पोस्ट कर सकते हैं अपने php कोड है जो हेडर –

+0

मुझे लगता है कि आप एक बग दर्ज कर सकते हैं उत्पन्न करता है) –

+0

मैं अगर यह यकीन नहीं है कोई फर्क नहीं पड़ता, लेकिन 'कंटेंट-ट्रांसफर-एन्कोडिंग: बाइनरी' भेजने के बारे में क्या? –

उत्तर

0

यह आपकी सामग्री प्रकार के कारण है।

आप बदलना चाहिए: सामग्री प्रकार: आवेदन/vnd.ms-एक्सेल

इस प्रयास करें:

<?php 

header("Content-Disposition: attachment; filename=$file"); 
header("Content-Type: application/zip"); 
... 
+0

ज़िप को इसके साथ क्या करना है? –

+0

जैसा कि मैंने कहा, मैंने एप्लिकेशन/ऑक्टेट-स्ट्रीम समेत कई अलग-अलग सामग्री प्रकारों की कोशिश की। मैंने सामग्री-प्रकार शीर्षलेख को सभी को एक साथ बंद कर दिया। इसने समस्या को हल नहीं किया। –

1

सामग्री प्रकार गलत है, यह text/csv, नहीं application/vnd.ms-excel होना चाहिए।

स्रोत: Wikipedia

0

इस प्रयास करें, यह डाउनलोड सभी ब्राउज़रों पर मजबूर करना चाहिए।

header ("Content-type: octet/stream"); 
    header ("Content-disposition: attachment; filename=\"".$file."\";"); 
    header("Content-Length: ".filesize($file)); 
    readfile($file); 
0

'आवेदन/vnd.ms-एक्सेल' MIME प्रकार माइक्रोसॉफ्ट एक्सेल द्विआधारी .xls फ़ाइलों के लिए विशेष रूप से है। क्रोम को बता रहा है कि आप एक द्विआधारी फ़ाइल भेज रहे हैं और फिर इसे एक टेक्स्ट फ़ाइल सौंपना समस्याएं पैदा करने के लिए बाध्य है। इसके बजाए, अनुमोदित अल्पविराम से अलग मूल्य प्रकार, 'एप्लिकेशन/सीएसवी' का उपयोग करें।

बदलें:

header("Content-Type: application/vnd.ms-excel"); 

साथ:

header("Content-Type: application/csv"); 
संबंधित मुद्दे

 संबंधित मुद्दे