在http://book.cakephp.org/2.0/en/controllers/request-response.html#cake-response-file中,我们可以找到强制下载本地文件的说明,但如果我们将路径作为远程文件(例如Amazon S3中的图像)传递,则请求会失败,因为它仍然在寻找本地文件系统中的文件。
使用媒体视图(http://book.cakephp.org/2.0/en/views/media-view.html)可以很好地处理远程路径,但这是一个不推荐使用的功能。
使用CakePHP强制下载远程文件的最佳方法是什么?
谢谢!
答案 0 :(得分:3)
您可以使用HttpSocket的组合将其保存到临时目录和新的Cake-Response-File,我正在寻找类似于从CDN提供文件的内容,并且遇到了您的问题。
http://book.cakephp.org/2.0/en/controllers/request-response.html#cake-response-file
$this->response->file(
$file['path'],
array('download' => true, 'name' => 'foo')
);
虽然我很欣赏这需要下载到本地服务器 - 其他人可能会有更好的建议,但这会在您测试时起作用。
答案 1 :(得分:2)
您可以通过执行以下操作来解决此问题。
在你的html模板中,你的锚标签应该是
<a href="link_to_your_action" target="_blank" download="file_name">Download file</a>
然后你可以使用Cakephp的CakeResponse class的位置方法。
$this->response->location($remoteURL);
return $this->response;
OR
简单地
return $this->redirect($remoteUrl);
HTML Anchor代码:
在锚标记中,您使用 _blank 来打扰当前页面。然后 href 是控制器操作的链接。最后 download 属性告诉浏览器下载文件而不是打开。注意:请检查this link以获取浏览器支持。
控制器操作
location 和 redirect 方法都可以为响应对象设置相应的标题。 我个人更喜欢第一种方法,因为它看起来像是一种更直接的方法。