2012-06-24 4 views
6

मैं एक बाइनरी फ़ाइल पुनर्प्राप्त करने के लिए PHP में डेटाबेस क्वेरी का उपयोग कर रहा हूं। लेकिन जब मैं इसे डाउनलोड करने के लिए मजबूर करने की कोशिश कर रहा हूं, हेडर ('सामग्री-प्रकार: एप्लिकेशन/ऑक्टेट-स्ट्रीम') लाइन 0 बाइट फाइलों का कारण बनती है। उस लाइन के बिना मैं पूरी सामग्री के साथ फ़ाइल डाउनलोड कर सकते हैं। यह एक बाइनरी फ़ाइल है जो निश्चित रूप से है इसलिए मैं समझ नहीं पा रहा हूं कि वह रेखा समस्या का कारण बनती है। कोड:शीर्षलेख ('सामग्री-प्रकार: एप्लिकेशन/ऑक्टेट-स्ट्रीम') 0 बाइट फाइलों का कारण

$result = mysql_query("SELECT data FROM stored_file WHERE file_name = '$q'"); 

while($row = mysql_fetch_array($result)) 
{ 
    $file = $row['data']; 
} 


    header('Content-disposition: attachment; filename='.$q); 
    header('Content-type: application/octet-stream'); 
    header('Content-Length: '.filesize($file)); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    echo $file; 

कोई विचार? धन्यवाद।

+2

सभी शीर्षकों पर टिप्पणी करें; त्रुटि रिपोर्टिंग सक्षम करें और अपनी स्क्रिप्ट चलाएं। किसी भी त्रुटि संदेश पोस्ट करें। –

+0

मुझे कोई त्रुटि संदेश नहीं मिला। – Akos

+0

हालांकि ऐसा लगता है कि फाइलसाइज ($ फ़ाइल) कुछ भी नहीं देता है। – Akos

उत्तर

5

filesize() एक सार्थक मूल्य वापस नहीं करेगा।

आप नहीं एक वास्तविक फ़ाइल नाम पहले पैरामीटर के रूप के रूप में आवश्यक $file में बाइनरी डेटा की है। इसलिए आपको एक त्रुटि मिलेगी। (Error_reporting सक्षम करें! त्रुटियों को नहीं देख रहे हैं, और उन्हें दो अलग-अलग चीजें नहीं हैं।)

तो आप strlen($file) का उपयोग करना चाहते हैं, filesize() नहीं।

बीटीडब्ल्यू, application/octet-stream या अन्य fill-ins के पास डाउनलोड को मजबूर करने के लिए कोई उपयोग नहीं है। यह Content-Disposition: हैडर है जो उस प्रभाव के लिए सबसे महत्वपूर्ण है। आपको अभी भी सही MIME प्रकार भेजने की अनुमति है।

+0

बहुत बहुत धन्यवाद! सामग्री-लंबाई शीर्षलेख का उपयोग करना महत्वपूर्ण है? त्रुटि रिपोर्टिंग के बारे में । मैंने इसे php.ini और यहां तक ​​कि कोड में भी सक्षम किया: ini_set ('display_errors', 1); त्रुटि_ रिपोर्टिंग (E_ALL); इसलिए मुझे समझ में नहीं आया कि मुझे त्रुटि संदेश क्यों नहीं मिला। – Akos

+0

अंतिम उपाय के रूप में 'set_error_handler ("var_dump");' स्क्रिप्ट के ऊपर 'आज़माएं। सामग्री-लंबाई: शीर्षलेख व्यापक रूप से माध्यमिक माना जाता है, यह आमतौर पर बिना काम करेगा। पेलोड मेटा डेटा केवल तभी जरूरी है जब आप एक वेबसर्वर की तरह रेंज: हेडर इत्यादि भी लागू करें। – mario

1

क्वेरी को देखने से मुझे लगता है कि $row['data'] में बाइनरी डेटा संग्रहीत है। सही सामग्री-लंबाई शीर्षलेख सेट करने के लिए आपको mb_strlen($row['data']); का उपयोग करना चाहिए। यदि आपकी मशीन पर कोई मल्टीबाइट समर्थन (mb_ फ़ंक्शंस) सक्रिय नहीं है, तो strlen() का उपयोग करें। लेकिन जागरूक रहें, इसके परिणामस्वरूप अजीब परिणाम हो सकते हैं क्योंकि बाइनरी डेटा में वास्तव में ईओएफ बाइट अनुक्रम हो सकता है और बहुत कम लंबाई लौटा सकता है। Mb_strlen फ़ंक्शन के साथ आप सहेजने वाले पक्ष पर हैं।

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