使用CakeResponse :: file()使用CakePHP强制下载远程文件

时间:2014-03-11 18:53:12

标签: php cakephp

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强制下载远程文件的最佳方法是什么?

谢谢!

2 个答案:

答案 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 方法都可以为响应对象设置相应的标题。 我个人更喜欢第一种方法,因为它看起来像是一种更直接的方法。