我正在使用cakephp 2.3.1
我想强制每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()我做错了什么,是否有其他文件我可以考虑更好地理解这一点?
答案 0 :(得分:23)
您不理解的行只是示例的一部分 - 它假定应用程序有一个名为Attachment
的模型,并且它有一个名为getFile
的方法。由于您没有Attachment
模型(或者至少它对控制器不可见),因此您将获得“对非对象的成员函数调用”错误。但这并不重要:您需要担心的是提供this->response->file()
的完整系统路径。在您的示例中,您可以通过将该行更改为:
$this->response->file(WWW_ROOT.'files/'. $id .'.mp4', array('download' => true, 'name' => 'Dance'));
您可以摆脱$this->Attachment->getFile
行,因为它与您的情况无关。
如果有帮助,请告诉我!
答案 1 :(得分: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']));
?>