2013-03-04 1 views
8

मैं CakePHP 2.3.1CakePHP 2.3.x फ़ाइलें भेजा जा रहा है और एक mp4 फ़ाइल के डाउनलोड के लिए मजबूर कर

उपयोग कर रहा हूँ मैं अपने 'दृश्य' में डाउनलोड प्रति http://book.cakephp.org/2.0/en/controllers/request-response.html#cake-response-file

एक mp4 फ़ाइल बाध्य करना चाहते हैं मेरे पास है जो सही ढंग से फ़ाइल नाम के लिए खोज कर रहा है, और फ़ाइल नाम खोजने और प्रदर्शित डाउनलोड लिंक निम्न कोड:

<?php $filename = APP . 'webroot/files/' . $dance['Dance']['id'] . '.mp4'; 
if (file_exists($filename)) { 
    echo $this->Html->link('DOWNLOAD', array('controller' => 'dances', 'action' => 'sendFile', $dance['Dance']['id'])); 
    } else { 
    echo 'Coming soon: available April 16th'; 
    } 
?> 

लिंक पर उपयोगकर्ता क्लिक करता है मैं mp4 फ़ाइल के डाउनलोड के लिए मजबूर करना चाहते हैं।

public function sendFile($id) { 
    $file = $this->Attachment->getFile($id); //Note: I do not understand the 'Attachment' and the 'getFile($id)' 
    $this->response->file($file['webroot/files/'], array('download' => true, 'name' => 'Dance')); 
    //Return reponse object to prevent controller from trying to render a view 
    return $this->response; 
} 

मैं 'लगाव' और 'getFile()'

मैं निम्न त्रुटि हो रही है समझ में नहीं आता:: मेरे नियंत्रक में मैं निम्नलिखित कोड वह काम नहीं करता है त्रुटि : एक गैर-ऑब्जेक्ट

पर एक सदस्य फ़ंक्शन getFile() पर कॉल करें मैं क्या गलत कर रहा हूं और क्या कोई अन्य दस्तावेज है जिसे मैं बेहतर समझने के लिए देख रहा हूं?

उत्तर

23

जिस रेखा को आप समझ नहीं सकते वह केवल उदाहरण का हिस्सा है - यह मानता है कि एप्लिकेशन में Attachment नामक एक मॉडल है और इसमें getFile नामक एक विधि है। चूंकि आपके पास Attachment मॉडल नहीं है (या कम से कम यह नियंत्रक के लिए दृश्यमान नहीं है) आपको "गैर-ऑब्जेक्ट पर सदस्य फ़ंक्शन पर कॉल करें" त्रुटि मिलती है। हालांकि यह महत्वपूर्ण नहीं है: आपको this->response->file() पर पूर्ण सिस्टम पथ प्रदान करने के बारे में चिंता करने की आवश्यकता है।

$this->response->file(WWW_ROOT.'files/'. $id .'.mp4', array('download' => true, 'name' => 'Dance')); 

आप $this->Attachment->getFile लाइन से छुटकारा मिल सकता है, क्योंकि यह आपके मामले में अप्रासंगिक है: अपने उदाहरण में, आप शायद उस करने के लिए है कि रेखा को बदलने के द्वारा प्राप्त कर सकते हैं।

अगर मुझे मदद मिली तो मुझे बताएं!

+0

वाह बहुत बहुत धन्यवाद। पूरी तरह से काम किया। – user2133231

+0

मैं सार्वजनिक फ़ंक्शन पर एक दूसरे चर में भी पास करने में सक्षम था ताकि यह ऐसा दिखाई दे: 'सार्वजनिक फ़ंक्शन sendFile ($ id, $ dance_name) {'जो freakn' अद्भुत है क्योंकि यह मुझे फ़ाइल नामों को स्वत: बनाने देता है। – user2133231

+0

कूल, खुशी है कि यह काम किया। क्या आप Anser स्वीकार कर सकते हैं तो मुझे कुछ प्रतिष्ठा मिलती है? चीयर्स :) –

1
public function downloadfile($id= null) {   
    $this->response->file(APP.'webroot\files\syllabus'.DS.$id,array('download'=> true, 'name'=>'Syllubus')); 
    return $this->response;  
} 

<?php echo $this->Html->link('Syllabus', 
    array('controller' => 'coursesubjects', 
    'action'=>'downloadfile', 
    $courseSubject['CourseSubject']['subject_syllabus'])); 
?> 
+1

आपको प्रतिक्रिया वापस करने की आवश्यकता नहीं है। '$ this-> autoRender = false' suffices। – mark

+1

आप एक स्थान पर डीएस का उपयोग क्यों कर रहे हैं, और फिर आपके द्वारा निर्दिष्ट पथ के बाकी हिस्सों में \। डीएस का अर्थ निर्देशिका विभाजक है और सिस्टम पर आपको आवश्यक स्लैश पर सेट किया गया है, इसलिए या तो सभी स्लेश के स्थान पर डीएस का उपयोग करें, या सभी हार्ड-कोडित स्लैश का उपयोग करें। – BadHorsie

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