2011-05-30 20 views
20

में एक फ़ाइल वापस जाने के लिए मैं कैसे एक फ़ाइलपीएचपी

/file.zip 

है एक उपयोगकर्ता

/download.php 

की बात आती है मैं उपयोगकर्ता के ब्राउज़र फ़ाइल डाउनलोड शुरू करना चाहते हैं। मैं उसको कैसे करू? क्या readfile सर्वर पर फ़ाइल खोलता है, जो करने के लिए एक अनावश्यक चीज की तरह लगता है। क्या सर्वर पर इसे खोलने के बिना फ़ाइल को वापस करने का कोई तरीका है?

उत्तर

58

मुझे लगता है कि आप चाहते हैं इस :)

 $attachment_location = $_SERVER["DOCUMENT_ROOT"] . "/file.zip"; 
     if (file_exists($attachment_location)) { 

      header($_SERVER["SERVER_PROTOCOL"] . " 200 OK"); 
      header("Cache-Control: public"); // needed for internet explorer 
      header("Content-Type: application/zip"); 
      header("Content-Transfer-Encoding: Binary"); 
      header("Content-Length:".filesize($attachment_location)); 
      header("Content-Disposition: attachment; filename=file.zip"); 
      readfile($attachment_location); 
      die();   
     } else { 
      die("Error: File not found."); 
     } 

HTH :)

+3

एफवाईआई: [HTTP शीर्षलेख "कैश-कंट्रोल: पब्लिक" होने का जोखिम क्या है?] (Http://stackoverflow.com/q/3339859/216084) –

+0

इसका काम। फ़ाइल नाम में स्थान के साथ डाउनलोड करने के लिए शीर्षलेख केवल हेडर जोड़ें ("सामग्री-विस्थापन: अनुलग्नक; फ़ाइल नाम = \" "file.zip।" \ ""); – sirmagid

1

यदि फ़ाइल सार्वजनिक है, तो आप इसे सीधे वेब सर्वर (उदा। अपाचे) से स्थिर फ़ाइल के रूप में सेवा दे सकते हैं, और stat.php को स्थिर URL पर रीडायरेक्ट कर सकते हैं। अन्यथा, आपको उपयोगकर्ता को प्रमाणीकृत करने के बाद फ़ाइल को ब्राउज़र भेजने के लिए readfile का उपयोग करना होगा (Content-Dispositon शीर्षलेख के बारे में याद रखें)।

1

रीडफाइल नौकरी ठीक करेगी और स्ट्रीम को सीधे वेबसर्वर पर पास कर देगा। यह फ़ाइल का समय भेजने के लिए सबसे अच्छा समाधान नहीं है, PHP अभी भी चलता है। बेहतर परिणामों के लिए आपको X-SendFile जैसे कुछ की आवश्यकता होगी, जो अधिकांश वेबसर्वर पर समर्थित है (यदि आप सही मॉड्यूल स्थापित करते हैं)।

सामान्य रूप से (यदि आप भारी भार की परवाह करते हैं), तो अपने मुख्य एप्लिकेशन सर्वर के सामने एक प्रॉक्सीइंग वेबसर्वर डालना सबसे अच्छा है। यह आपके एप्लिकेशन सर्वर (उदाहरण के लिए अपाचे के लिए) को तेज़ी से ऊपर कर देगा, और प्रॉक्सी सर्वर (वार्निश, स्क्विड) आमतौर पर धीमी गति से उच्च विलंबता या क्लाइंट वाले क्लाइंट को बाइट्स ट्रांसफर करने में बहुत बेहतर होता है।

1

यदि फ़ाइल सार्वजनिक रूप से पहुंच योग्य है, तो बस अपनी फ़ाइल के URL पर एक साधारण redirect करें।

+1

मैं नीचे वोट नहीं कर सकते हैं; लेकिन मुझे करना है। प्रश्न है; एक php स्क्रिप्ट तक पहुंचने वाली फ़ाइल कैसे बनाएं। मुझे लगता है कि हम जानते हैं कि हम सीधे एक फ़ाइल तक पहुंच सकते हैं, लेकिन एक PHP स्क्रिप्ट का उपयोग मध्य आदमी के रूप में नियंत्रण के रूप में देता है। उदाहरण के लिए, कुछ उपयोगकर्ताओं को कुछ डाउनलोड की अनुमति देना चाहते हैं, और फाइलें डेटाबेस पर भी हो सकती हैं। – Mike

+1

अगर मैं कर सकता हूं तो मैं आपकी टिप्पणी को कम कर दूंगा! :) ओपी PHP का उपयोग कर रहा है और ब्राउज़र को एक फ़ाइल डाउनलोड करना चाहता है। आप PHP के साथ रीडायरेक्ट बना सकते हैं - कुछ ऐसा जो शायद ओपी में नहीं हुआ था। डार्कडस्ट का जवाब बिल फिट बैठता है और मान्य है। –