2013-03-04 19 views
8

Tôi đang sử dụng cakephp 2.3.1CakePHP 2.3.x Sending Files và buộc tải về của một tập tin mp4

Tôi muốn buộc tải về một tập tin mp4 mỗi http://book.cakephp.org/2.0/en/controllers/request-response.html#cake-response-file

Trong 'xem' của tôi, tôi có đoạn mã sau đó đang tìm kiếm một cách chính xác cho tên tập tin, và việc tìm kiếm tên tập tin, và hiển thị liên kết tải xuống:

<?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'; 
    } 
?> 

Khi người dùng nhấp vào liên kết tôi muốn buộc các download file mp4. Trong điều khiển của tôi, tôi có đoạn mã sau đó không làm việc:

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; 
} 

Tôi không hiểu 'đính kèm' và 'getfile()'

Tôi nhận được lỗi sau: Lỗi : Gọi hàm thành viên getFile() trên một đối tượng không

Tôi đang làm gì sai và có bất kỳ tài liệu nào khác mà tôi có thể xem để hiểu điều này tốt hơn không?

Trả lời

23

Dòng bạn không hiểu chỉ là một phần của ví dụ - nó giả định ứng dụng có một mô hình được gọi là Attachment và có phương thức có tên là getFile. Vì bạn không có mô hình Attachment (hoặc ít nhất nó không hiển thị với bộ điều khiển), bạn sẽ nhận được một lỗi "gọi hàm thành viên trên một đối tượng không". Tuy nhiên, điều đó không quan trọng: tất cả những gì bạn cần lo lắng là cung cấp đường dẫn hệ thống đầy đủ đến this->response->file(). Trong ví dụ của bạn, có lẽ bạn có thể nhận được rằng bằng cách thay đổi dòng để:

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

Bạn có thể thoát khỏi dòng $this->Attachment->getFile vì nó là không thích hợp trong trường hợp của bạn.

Hãy cho tôi biết nếu điều đó hữu ích!

+0

Xin cảm ơn rất nhiều. Làm việc hoàn hảo. – user2133231

+0

Tôi cũng có thể truyền vào một biến thứ hai trên chức năng công cộng để nó trông như thế này: 'public sendFile ($ id, $ dance_name) {' đó là freakn 'tuyệt vời vì nó cho phép tôi tự động tạo tên tập tin. – user2133231

+0

Tuyệt vời, vui vì nó hoạt động. Bạn có thể chấp nhận anser vì vậy tôi nhận được một số danh tiếng? Chúc mừng :) –

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

bạn không cần trả lại câu trả lời. '$ this-> autoRender = false' đủ. – mark

+1

Tại sao bạn sử dụng DS ở một nơi, và sau đó trong phần còn lại của đường dẫn bạn chỉ định \. DS có nghĩa là phân cách thư mục và được đặt thành dấu gạch chéo mà bạn yêu cầu trên hệ thống, do đó, hoặc sử dụng DS thay cho tất cả dấu gạch chéo hoặc sử dụng tất cả các dấu gạch chéo cứng. – BadHorsie

Các vấn đề liên quan