cakephp文件下载链接

时间:2013-04-08 20:05:41

标签: php cakephp

我遇到了一个问题,我现在试图解决两天以上:我已经使用cakephp构建了一个网站,一切正常,但当我尝试实现存储文件的下载链接时,我遇到了问题在APP_DIR/someFolder/someFile.zip下。

如何设置someFolder内文件的下载链接?我经常偶然发现“媒体观点”我试图实施它们,但到目前为止我还没有成功。

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

2 个答案:

答案 0 :(得分:16)

自2.3版以来,不推荐使用媒体视图。您应该使用Sending files代替。

查看控制器中的这个最小示例:

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的第一个参数与您的APP目录相关。因此,调用$this->response->file('someFolder' . DS . 'someFile.zip')将下载文件APP/someFolder/someFile.zip

“发送文件”至少需要CakePHP 2.0版。另请考虑查看上面的Cookbook链接。


如果您运行的是旧版本的CakePHP,则应使用您在问题中提到的媒体视图。使用此代码并参考Media Views (Cookbook)

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

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

答案 1 :(得分:0)

CakePHP 3

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

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

  

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

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