我遇到了一个我试图解决两天多的问题:我已经使用 cakephp 建立了一个网站,并且一切正常,但是当我尝试实现存储在APP_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
是相对于您的APP
目录的。所以调用$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 中或编写一个组件,然后从其他控制器调用。
确保根据下载文件更改内容类型
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]);
}