2009-12-29 13 views
6

मैंने PHP में एक फ़ाइल डाउनलोड स्क्रिप्ट बनाई है, यह काम करता है, लेकिन वेब ब्राउज़र फ़ाइल को "अज्ञात लंबाई" के रूप में रिपोर्ट करते हैं। मेरा कोड निम्नानुसार है:PHP डाउनलोड स्क्रिप्ट के साथ सही फ़ाइल आकार भेजना

function downloadFile($file){ 
    // Set up the download system... 
    header('Content-Description: File Transfer'); 
    header('Content-Type: '.mime_content_type($file)); 
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: '.filesize($file)); 

    // Flush the cache 
    ob_clean(); 
    flush(); 

    // Send file to browser 
    readfile($file); 

    // DO NOT DO ANYTHING AFTER FILE DOWNLOAD 
    exit; 
} 

उत्तर

13
http://paul.luminos.nl/update/471 से मूल रूप से

:

CrimsonBase website एक मजबूत पीएचपी एक his article about PHP-controlled file downloads में एंड्रयू जॉनसन द्वारा प्रकाशित के समान स्क्रिप्ट के माध्यम से उन्हें पारित करके डाउनलोड की पुष्टि करता है।

"आप Zlib, mod_deflate साथ और इतने सामग्री-लंबाई हेडर पर फ़ाइलें सेक तो सही नहीं होगा तो आप समाप्त कर देंगे:

एंड्रयू लेख के अंत में एक बहुत ही महत्वपूर्ण टिप्पणी करता है फ़ाइलों को डाउनलोड करते समय "अज्ञात आकार" और "अज्ञात समय शेष" देखकर। "

मैं इस पर जोर देना चाहते हैं: यदि आपके ब्राउज़र अपने PHP द्वारा उत्पन्न हेडर का पालन किया जाना प्रतीत नहीं होता है पटकथा विशेष रूप से Content-Length -यह काफी संभावना है कि अपाचे के mod_deflate एक्सटेंशन के सक्षम होने है।

आप आसानी से किसी लागू .htaccess फ़ाइल में निम्न पंक्ति का उपयोग कर एकल स्क्रिप्ट के लिए इसे अक्षम कर सकते हैं:

SetEnvIfNoCase Request_URI ^/download\.php no-gzip dont-vary 

जहां download.php यहाँ डाउनलोड सर्वर के रूट निर्देशिका पथ में स्थित लिपि में माना जाता है (उदाहरण के लिए www.crimsonbase.com/download.php)। (इसका कारण यह नियमित अभिव्यक्ति ^/download\.php है।)

+0

दिलचस्प। मुझे उसमें देखना होगा। –

+0

धन्यवाद, मुझे अपने डाउनलोड में "gzip" सामग्री प्रकार मिल रहा था और इसे आपकी एचटीएसीएएस लाइन से छुटकारा पाने में सक्षम था, अब मैं डाउनलोड प्रगति को फिर से देख सकता हूं क्योंकि ब्राउज़र द्वारा कुल फ़ाइल आकार सही ढंग से पढ़ा जाता है। – adrianTNT

0

readfile() फ़ंक्शन से पहले कैश को फ़्लश करने का प्रयास न करें। मेरा कोड आपके अन्यथा लगभग समान है, और ठीक काम करता है।

+0

कोशिश की कि कुछ भी नहीं। डाउनलोड अभी भी ठीक काम करता है, यह सिर्फ वेब ब्राउज़र "अज्ञात फ़ाइल आकार" कहेंगे, भले ही मैंने इसे "सामग्री-लंबाई" दिया हो। बात यह है कि, अगर मैं wget का उपयोग करता हूं, तो यह सही फ़ाइल आकार की रिपोर्ट करता है। –

6

मैं इस एक ही समस्या थी, और मुझे Content-Disposition से पहले Content-Length हैडर भेज कर यह तय की।

header('Content-Type: video/mp4'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-Length: ".filesize($file_url)); 
header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
readfile($file_url); 
संबंधित मुद्दे