2008-09-03 21 views
40

लिंक में जाने पर स्वचालित रूप से ब्राउज़र को स्थानीय मशीन पर फ़ाइल डाउनलोड करने के लिए PHP में जोड़ने के लिए आपको कौन सी कोड जोड़ने की आवश्यकता है?PHP में स्वचालित रूप से डाउनलोड कैसे प्रारंभ करें?

मैं विशेष रूप से डाउनलोड साइटों के समान कार्यक्षमता के बारे में सोच रहा हूं जो उपयोगकर्ता को सॉफ़्टवेयर के नाम पर क्लिक करने के बाद डिस्क पर फ़ाइल सहेजने के लिए संकेत देता है?

उत्तर

48

फाइल outputting से पहले निम्न हेडर भेजें:

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\""); 
header("Content-Type: application/force-download"); 
header("Content-Length: " . filesize($File)); 
header("Connection: close"); 

@grom: 'आवेदन/ओकटेट धारा' MIME प्रकार के बारे में दिलचस्प। मुझे इसके बारे में पता नहीं था, हमेशा 'एप्लिकेशन/फोर्स-डाउनलोड' का उपयोग किया जाता है :)

+0

मुझे यकीन नहीं है कि क्यों, क्योंकि यह मेरे लिए नया है, लेकिन यह स्क्रिप्ट केवल तभी काम करती है जब मेरे पास सामग्री-लंबाई वाली रेखा हो। – sehummel

36

यहां एक पीडीएफ वापस भेजने का एक उदाहरण है।

header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); 
header('Content-Transfer-Encoding: binary'); 
readfile($filename); 

@Swish मैं कुछ भी अलग (IE और Firefox में परीक्षण) करने के लिए नहीं मिला आवेदन/बल डाउनलोड सामग्री प्रकार। क्या वास्तविक एमआईएम प्रकार वापस भेजने का कोई कारण नहीं है?

पीएचपी मैनुअल Hayley Watson पोस्ट में

इसके अलावा:

आप के बजाय गाया जा रहा है, एक फाइल डाउनलोड किया है और बचाया जा करने के लिए मजबूर करना चाहते हैं, याद वहाँ "के रूप में आवेदन/बल ऐसी कोई MIME प्रकार है कि डाउनलोड"। इस स्थिति में उपयोग करने के लिए सही प्रकार "एप्लिकेशन/ऑक्टेट-स्ट्रीम" है, और किसी और चीज का उपयोग केवल इस तथ्य पर निर्भर है कि ग्राहकों को अपरिचित एमआईएम प्रकारों को अनदेखा करना है और इसके बजाय "एप्लिकेशन/ऑक्टेट-स्ट्रीम" का उपयोग करना है (संदर्भ: अनुभाग आरएफसी 2046 के 4.1.4 और 4.5.1)।

IANA के अनुसार 0 पंजीकृत कोई भी आवेदन/बल-डाउनलोड प्रकार नहीं है।

+1

यह पीसी पर काम करता है लेकिन ... "डाउनलोड करने में असमर्थ। सामग्री समर्थित नहीं है" जब मैं एंड्रॉइड डिवाइस पर डाउनलोड पेज पर जाता हूं। क्यूं कर? – Emerald214

+1

@ Emerald214 कोई पीडीएफ रीडर नहीं। या पीडीएफ सामग्री प्रकार – grom

+0

के लिए कोई सहयोग नहीं है विशेष रूप से यदि लक्षित फ़ाइल प्रकार एक .zip है और आप पेज पर जो कुछ भी कर रहे हैं वह PHP के माध्यम से फ़ाइल-डाउनलोड को लात मार रहा है, तो आप '' 'ob_clean();' '' और '' 'ob_flush();' '' उपर्युक्त उत्तर में दिए गए कोड से पहले; विंडोज़ में एक .zip को मूल रूप से खोलने का प्रयास करते समय, मुझे एक मुद्दा था जिसमें ओएस ने बताया कि इस तरह से अधिग्रहित .zip-archives अमान्य थे, भले ही 7zip और अन्य समर्पित संपीड़ित-संग्रह-प्रारूप-हैंडलिंग टूल उनके साथ ठीक हो सकें । – SeldomNeedy

7

एक साफ उदाहरण।

<?php 
    header('Content-Type: application/download'); 
    header('Content-Disposition: attachment; filename="example.txt"'); 
    header("Content-Length: " . filesize("example.txt")); 

    $fp = fopen("example.txt", "r"); 
    fpassthru($fp); 
    fclose($fp); 
?> 
+0

यह काम कर सकता है, लेकिन मैं इसे "साफ" कहने के लिए अब तक नहीं जाऊंगा। एक के लिए, इसमें फ़ाइल नाम को तीन बार टाइप करना शामिल है। इसके बजाय, मैं फ़ाइल नाम को चर के रूप में सेट करता हूं, इस तरह आपका कोड अनावश्यक नहीं है और आप त्रुटियों के अवसर को कम करते हैं। – Mike

0

मेरी कोड txt, डॉक्टर, docx, पीडीएफ, ppt, pptx, jpg, png, ज़िप एक्सटेंशन के लिए काम करता है और मुझे लगता है कि इसके बेहतर स्पष्ट रूप से वास्तविक MIME प्रकार का उपयोग करें।

$file_name = "a.txt"; 

// extracting the extension: 
$ext = substr($file_name, strpos($file_name,'.')+1); 

header('Content-disposition: attachment; filename='.$file_name); 

if(strtolower($ext) == "txt") 
{ 
    header('Content-type: text/plain'); // works for txt only 
} 
else 
{ 
    header('Content-type: application/'.$ext); // works for all extensions except txt 
} 
readfile($decrypted_file_path); 
संबंधित मुद्दे