到目前为止,我已经设法将文件上传到 app/files 目录并使用已弃用的媒体视图下载它们。我无法使用
$file = $this->Attachment->getFile($id);
我想向用户显示图像/文件,比如用户的个人资料图像。我怎样才能在不影响用户图像安全的情况下完成这项工作。
我得到错误
Call to a member function getFile() on a non-object
我不想使用任何插件。
提前致谢。
到目前为止,我已经设法将文件上传到 app/files 目录并使用已弃用的媒体视图下载它们。我无法使用
$file = $this->Attachment->getFile($id);
我想向用户显示图像/文件,比如用户的个人资料图像。我怎样才能在不影响用户图像安全的情况下完成这项工作。
我得到错误
Call to a member function getFile() on a non-object
我不想使用任何插件。
提前致谢。
你有三个选择;
imagejpeg()
函数。为此,您应该在不使用“布局”的情况下输出图像并设置正确的响应标头。可以在此处找到有关“响应”对象的更多信息:http: //book.cakephp.org/2.0/en/controllers/request-response.html#sending-files我现在没有时间写例子,但如果需要可以提供一些指示
更新
尽管在 CakePHP 2.3 中不推荐使用 MediaView,但您仍然可以从中“学习”如何自己处理文件下载。MediaView 中的大部分“魔法”都集中在 Response-object 周围,它几乎在 Cake 内部的每个对象中都可用(也在你的 Controller 内部)。将 de MediaView 转换为可以附加到控制器以输出/发送文件的组件可能很容易。
MediaView 的来源可以在这里找到:http: //api.cakephp.org/2.2/source-class-MediaView.html#23-242
而且,关于通过响应对象发送文件的其他信息可以在我之前提到的链接中找到(http://book.cakephp.org/2.0/en/controllers/request-response.html#sending-files)
重要的
尽管与您的问题没有直接关系,但有一些警告;
用户提供的上传是危险的,请务必检查文件类型并清理文件名和路径(如果您允许用户指定路径)。始终假设用户能够发送类似“../../../../”之类的路径名,以防范这种情况
确保对包含用户上传的文件的目录/URL禁用 PHP 解析。我已经看到用户能够上传dangerous_file.php.jpg
并能够在之后重命名文件的情况(删除.jpg
)。
可以在此处找到有关在路径中禁用 PHP 的更多信息: 使用 .htaccess 在目录(包括所有子目录)中禁用 PHP
并且,关于最后一点:确保在用户目录中禁用“覆盖”这些设置(例如,考虑用户能够上传文件的情况.htaccess
?
现在在 cakephp 2.3 中不推荐使用媒体视图
请查看此链接:
http://book.cakephp.org/2.0/en/views/media-view.html
public function download() {
$this->viewClass = 'Media';
// Download app/outside_webroot_dir/example.zip
$params = array(
'id' => 'example.zip',
'name' => 'example',
'download' => true,
'extension' => 'zip',
'path' => APP . 'outside_webroot_dir' . DS
);
$this->set($params);
}