2009-08-02 14 views
11

में काम नहीं कर रहे फ़ाइल को डाउनलोड करने के लिए PHP स्क्रिप्ट में मेरी एक स्क्रिप्ट है जो $ _GET ['key'] से एक कुंजी लेती है, डेटाबेस में स्थान देखती है और कुछ शीर्षकों के साथ रीडफाइल का उपयोग करता है ताकि डाउनलोड के लिए एक डाउनलोड प्रस्तुत किया जा सके। उपयोग। यह फ़ायरफ़ॉक्स में काम करता है लेकिन आईई 8 नहीं, इसे किसी अन्य आईई पर परीक्षण करने में सक्षम नहीं है। मुझे आईई में निम्न त्रुटि मिलती है: "इंटरनेट एक्सप्लोरर www.example.com से download.php डाउनलोड नहीं कर सकता"। जैसे कि यह PHP स्क्रिप्ट डाउनलोड करने का प्रयास कर रहा है।आईई


$the_query = "SELECT * FROM `files` WHERE `user_id`=" . $_SESSION['user_id'] . " AND `key`='" . $key . "'"; 

$result = mysql_query($the_query); 
$row = mysql_fetch_array($result); 

$file = '/var/www/vhosts/www.example.com/httpsdocs/uploads/' . $row['id'] . '/' . $row['file']; 

header("Content-type: application/octet-stream"); 
header("Content-length: ".filesize($file)); 
header('Content-Description: File Transfer'); 
header("Cache-control: private"); 
header('Content-Disposition: attachment; filename=' . rawurlencode(basename($file))); 
readfile($file); 
+4

एसक्यूएल इंजेक्शन और mysql_real_escape_string पर एक नज़र डालें। कोड का यह टुकड़ा कमजोर है। – erenon

+0

ओह भगवान हाँ कृपया mysql_real_escape_string – AaronLS

+0

इस बारे में बहुत कुछ नहीं पता है, लेकिन फ़ाइल फ़ाइल में फ़ाइल एक्सटेंशन के साथ कुछ करने के लिए कुछ हो सकता है – AaronLS

उत्तर

28

त्रुटि को हल करने के हेडर से कैश-कंट्रोल हटा दें जो डाउनलोड समस्या बनाता है।

उपरोक्त कोड फ़ाइल के शीर्ष पर जोड़ा जाना चाहिए।

यह हमारे लिए ठीक काम करता है।

+0

प्लैनेट मर्स से आने वाले एलियन बग से मेरी जान बचाने के लिए धन्यवाद ... मैं कभी नहीं जानता था कि मैं क्या कर सकता हूं लेकिन तुम्हारा यह कवच मेरी बहुत बड़ी बिग बग को मारने में मेरी मदद करता है ... बग मर चुका है ... हाँ !! .. धन्यवाद :-) – effkay

+0

हम इस समस्या के साथ दौर और गोल चले गए। ब्लॉग पोस्ट आदि से इतनी सारी सिफारिशों की कोशिश की। यह वह था जो इसे ठीक करता था! – BishopZ

3

इस बदलें:
header("Content-type: application/octet-stream");
इस के साथ :
header("Content-Type: application/force-download");

इस post के अनुसार, आईई सामान्य रूप से अपने हेडर को नहीं सुनता है, और बदले में खुद के लिए लग रहा है कि तुम क्या भेज रहे हैं।

+0

मैंने पहले ही यह कोशिश की है, दुर्भाग्य से, वही त्रुटि, धन्यवाद। – Stuart

+1

'एप्लिकेशन/ऑक्टेट-स्ट्रीम' डेटा के लिए आधिकारिक एमआईएम मीडिया प्रकार है जिसे डाउनलोड करने का इरादा है (आरएफसी 2046 देखें)। – Gumbo

+0

मैं सोच रहा हूं कि लोग उन सभी आरएफसी कैसे जानते हैं? –

0

बस एक संकेत, किसी को (मेरे जैसे) सीधे में एक filedownload में प्रवेश के साथ समस्याओं का सामना करना पड़ रहा है, तो एक सुरक्षित https अनुरोध का उपयोग कर पता बार। वहाँ एक आईई बग है कि इस डाउनलोड विफल कर रही है है:

http://support.microsoft.com/kb/323308/en-us

केवल वैकल्पिक हल लेख के अनुसार कैश-हेडर स्थापित करने जा रहा है। "इंटरनेट एक्सप्लोरर www.example.com से download.php डाउनलोड नहीं कर सकते", अपनी स्क्रिप्ट के लिए इन हेडर जोड़ें::

header("Pragma: ");

header("Cache-Control: ");

कोड होगा

0

इसे कभी भी प्रतिस्थापित न करें: शीर्षलेख ("सामग्री-प्रकार: एप्लिकेशन/ऑक्टेट-स्ट्रीम");

इसके साथ: शीर्षलेख ("सामग्री-प्रकार: एप्लिकेशन/बल-डाउनलोड");

"एप्लिकेशन/ऑक्टेट-स्ट्रीम" केवल सबसे सार्वभौमिक है और अधिकांश ब्राउज़रों पर काम करता है।

मैंने अपने परीक्षणों में से एक में "एप्लिकेशन/ज़िप" का उपयोग करने की कोशिश की क्योंकि मैं तकनीकी रूप से ज़िप फ़ाइल से निपट रहा था, लेकिन आईई 6.0 ने डाउनलोड को दूषित कर दिया! हालांकि बाकी सब कुछ सामान्य रूप से व्यवहार किया। लेकिन हाँ, उसे "एप्लिकेशन/ऑक्टेट-स्ट्रीम" पर वापस जाना पड़ा, इसलिए फ़ाइल एक्सटेंशन का पता लगाने की कोशिश करने वाले किसी भी कोड को बाहर निकालना और विस्तार के लिए विशिष्ट अन्य सामग्री-प्रकारों पर स्विच करना जोखिम भरा है! आप सभी बाइनरी फ़ाइलों के लिए "एप्लिकेशन/ऑक्टेट-स्ट्रीम" का उपयोग कर बेहतर हैं!