Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cakephp文件下载链接_Php_Cakephp - Fatal编程技术网

cakephp文件下载链接

cakephp文件下载链接,php,cakephp,Php,Cakephp,我遇到了一个两天多以来一直在努力解决的问题:我用cakephp建立了一个网站,一切正常,但当我试图实现存储在APP\u DIR/someFolder/someFile.zip下的文件下载链接时,我遇到了麻烦 如何设置someFolder中文件的下载链接?我经常被“媒体观点”绊倒,我试图实现它们,但到目前为止,我一直没有成功 此外,没有更简单的方法使文件可下载吗?自2.3版以来,媒体视图已被弃用。你应该改用 在控制器中查看以下最简单的示例: public function download($id

我遇到了一个两天多以来一直在努力解决的问题:我用cakephp建立了一个网站,一切正常,但当我试图实现存储在
APP\u DIR/someFolder/someFile.zip下的文件下载链接时,我遇到了麻烦

如何设置
someFolder
中文件的下载链接?我经常被“媒体观点”绊倒,我试图实现它们,但到目前为止,我一直没有成功


此外,没有更简单的方法使文件可下载吗?

自2.3版以来,媒体视图已被弃用。你应该改用

在控制器中查看以下最简单的示例:

public function download($id) {
    $path = $this->YourModel->aMagicFunctionThatReturnsThePathToYourFile($id);
    $this->response->file($path, array(
        'download' => true,
        'name' => 'the name of the file as it should appear on the client\'s computer',
    ));
    return $this->response;
}
$this->response->file
的第一个参数与您的
应用程序
目录相关。因此,调用
$this->response->file('someFolder.DS.'someFile.zip')
将下载文件
APP/someFolder/someFile.zip

“发送文件”至少需要CakePHP 2.0版。请同时考虑一下上面的食谱链接。
如果您运行的是旧版本的CakePHP,您应该使用您在问题中已经提到的媒体视图。使用此代码并参阅

对于旧版本,以下是相同的方法:

public function download($id) {
    $this->viewClass = 'Media';
    $path = $this->YourModel->aMagicFunctionThatReturnsThePathToYourFile($id);
    // in this example $path should hold the filename but a trailing slash
    $params = array(
        'id' => 'someFile.zip',
        'name' => 'the name of the file as it should appear on the client\'s computer',
        'download' => true,
        'extension' => 'zip',
        'path' => $path
    );
    $this->set($params);
}

在CakePHP 3中生成下载链接的正确方法

将此函数放在AppController中,或编写一个组件,然后从其他控制器调用

确保根据下载文件更改内容类型


如果您使用的是Apache,可以通过在“下载”目录中添加
.htaccess
来强制下载。这里有一些例子:这样你就不需要通过phphat提供文件下载服务,把它们放在APP_DIR/webroot/someFolder/?@sєm sєm你说得对(没有注意到文件不在webroot中)。尽管只将它们放在公共目录中不会自动强制下载(例如,如果文件是JPG)。添加发送“下载”标题的.htaccess将使人们更容易“下载”文件,而不是在浏览器中查看文件。虽然可以这样做查看PHP(见下面的答案),但这并不总是理想的,尤其是对于大文件。。。我按照您描述的方式实现了它,但是我得到了:调用未定义的方法CakerResponse::files()。。。我在文档中找到了它,但找不到file()方法,但我确实找到了下载方法,但我无法使它与Ether一起工作..:(@sєєєєєєєєєєєєєєє:如果可能的话,我想把它放在Webroot之外……这不是有意义的数据,但是如果这些文件不在那里,我会感觉更好,让世界抓取拷贝并在周围玩……@MichaelHofmair:你使用哪个CakePHP版本?正如我在回答中提到的,你至少需要Cake对旧版本的解释。目前我正在运行2.3。1@MichaelHofmair对于2.3.1版,您当然可以使用
$this->response->file
(最上面的示例)。关于您上面的评论之一:如果您得到一个“未定义的方法”错误,您可能拼错了方法的名称。名称是
$this->response->file
–不是“file”的复数形式。只需复制并粘贴我的代码就可以了。我已经测试过了。为了调试,不要忘了设置
$path
。使用
$path='someFolder/someFile.zip';
。蛋糕会让您知道文件是否存在。
public function downloadResponse() {
    return $this->response
        ->withHeader('Content-Type', 'application/pdf')
        ->withHeader('Content-Disposition', 'attachment;')
        ->withHeader('Cache-Control', 'max-age=0')
        ->withHeader('Cache-Control', 'max-age=1')
        ->withHeader('Expires', 'Mon, 26 Jul 1997 05:00:00 GMT')
        ->withHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' PDT')
        ->withHeader('Cache-Control', 'cache, must-revalidate')
        ->withHeader('Pragma', 'public')
        ->withFile($filePath, ['download' => true]);
}