cakephp 2.3如何管理用户的文件上传并在登录时显示文件?

时间:2013-03-01 07:13:43

标签: cakephp cakephp-2.3

到目前为止,我设法做的是将文件上传到app / files目录并使用不推荐的媒体视图下载它们。我无法使用

    $file = $this->Attachment->getFile($id);

我想向用户显示图像/文件,比如用户的个人资料图片。如何在不包含用户图像安全性的情况下完成此任务。

我收到错误

    Call to a member function getFile() on a non-object

我不想使用任何插件。

提前致谢。

2 个答案:

答案 0 :(得分:1)

你有三个选择;

  1. 创建一个mod_rewrite规则,允许通过URL查看Web根目录之外的目录。这样就不必通过PHP脚本输出图像了
  2. 在您的webroot中创建一个指向Web根目录之外的目录的符号链接。这样,图像也将由apache直接输出,而不是通过PHP脚本输出。您可以在此处按照“插件资源”的说明进行操作:http://book.cakephp.org/2.0/en/plugins.html#plugin-assets
  3. 使用PHP读取文件并使用PHP输出(调整后的版本)图像,例如通过imagejpeg()函数。为此,您应该在不使用“布局”的情况下输出图像并设置正确的响应标头。有关“响应”对象的更多信息,请访问:http://book.cakephp.org/2.0/en/controllers/request-response.html#sending-files
  4. 我目前没有时间编写示例,但如果需要可以提供一些指示

    <强>更新

    尽管在CakePHP 2.3中不推荐使用MediaView,但您仍然可以从中学习如何自行处理文件下载。 MediaView中的大多数“魔术”都集中在Response-object周围,该对象几乎可以在Cake内部的每个对象中使用(也在Controller中)。将de MediaView转换为可以附加到Controller以输出/发送文件的组件可能很容易。

    可以在此处找到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

    重要

    虽然与您的问题没有直接关系,但有些警告;

    用户提供的上传非常危险 始终确保检查文件类型并清理文件名和路径(如果您允许用户指定路径)。始终假设用户能够发送类似“../../../../”的内容作为路径名自己防范该情况

    确保禁用PHP解析以查找包含用户上传文件的目录/ URL。我见过用户能够上传dangerous_file.php.jpg并且之后能够重命名文件的情况(删除.jpg)。

    有关在路径中禁用PHP的更多信息,请访问: Disable PHP in directory (including all sub-directories) with .htaccess

    关于最后一点:确保在用户目录中禁用“覆盖”这些设置(例如,考虑用户能够上传的情况一个.htaccess文件?

答案 1 :(得分:0)

现在在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);
}