【问题标题】:force download remote file with CakePHP using CakeResponse::file()使用 CakeResponse::file() 使用 CakePHP 强制下载远程文件
【发布时间】:2014-03-11 18:53:12
【问题描述】:

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

谢谢!

【问题讨论】:

  • 找到什么了吗?

标签: php cakephp


【解决方案1】:

您可以结合使用 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')
);

虽然我很欣赏这需要下载到本地服务器 - 其他人可能有更好的建议,但这在您测试时会起作用。

【讨论】:

  • 感谢您的回答!我试图避免下载到服务器,因为 PHP 可以直接从源代码读取文件。目前我已经用纯 PHP 实现了一个解决方案,即不使用 CakeResponse 对象
【解决方案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;

简单

return $this->redirect($remoteUrl);

说明

HTML 锚标记:

在锚标记中,您使用 _blank 来不打扰您当前的页面。那么 href 是控制器动作的链接。最后 download 属性告诉浏览器下载文件而不是打开文件。注意:查看this link 以获取浏览器支持。

控制器动作

locationredirect 方法都做同样的事情来为响应对象设置适当的标头。 我个人更喜欢第一种方法,因为它看起来更直接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-24
    • 2012-11-13
    • 2010-12-03
    • 1970-01-01
    • 2016-01-16
    • 2010-11-03
    • 2010-11-30
    相关资源
    最近更新 更多