1

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

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

我想向用户显示图像/文件,比如用户的个人资料图像。我怎样才能在不影响用户图像安全的情况下完成这项工作。

我得到错误

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

我不想使用任何插件。

提前致谢。

4

2 回答 2

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

我现在没有时间写例子,但如果需要可以提供一些指示

更新

尽管在 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

于 2013-03-01T07:55:22.727 回答
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);
}
于 2013-03-01T07:26:47.943 回答