【问题标题】:CakePHP - Saving and serving files outside of webrootCakePHP - 在 webroot 之外保存和提供文件
【发布时间】:2013-12-21 15:40:54
【问题描述】:

使用 Cake 2.4.3 稳定版

所以我在这里有时间,我已经修改了这个插件以将文件保存到应用程序文件夹https://github.com/srs81/CakePHP-AjaxMultiUpload/

上传的文件正在保存到 /public_html/app/files

现在奇怪的是,当尝试将这些文件提供给视图时,我可以读取文件名、文件大小,但不能读取文件本身、图像、pdf 等。

当我尝试通过直接 url 访问文件时,我收到此错误:

错误:找不到 FilesController。

我怎么能读到文件名、文件大小,却不能读到文件本身?

需要将文件保存在 app 文件夹中。这些文件应该受到保护,因此只能由登录到应用程序的用户访问。我尝试使用蛋糕发送文件响应但没有结果。

编辑:我想这里真正的问题是如何从 APP 读取文件。 DS 。 “文件”?

查看代码:

    public function view ($model, $id, $edit=false) {
    $results = $this->listing ($model, $id);

    $directory = $results['directory'];
    $baseUrl = $results['baseUrl'];
    $files = $results['files'];

    $str = "<dt>" . __("Pictures") . "</dt>\n<dd>";
    $count = 0;
    $webroot = Router::url("/") . "ajax_multi_upload";
    foreach ($files as $file) {
        $type = pathinfo($file, PATHINFO_EXTENSION);
        $filesize = $this->format_bytes (filesize ($file));
        $f = basename($file);
        $url = $baseUrl . "/$f";
        if ($edit) {
            $baseEncFile = base64_encode ($file);
            $delUrl = "$webroot/uploads/delete/$baseEncFile/";          
            $str .= "<a href='$delUrl'><img src='" . Router::url("/") . 
                "ajax_multi_upload/img/delete.png' alt='Delete' /></a> ";
        }
        $str .= "<img src='$url' /> ";
        $str .= "<a href='$url'>" . $f . "</a> ($filesize)";
        $str .= "<br />\n";
    }
    $str .= "</dd>\n"; 
    return $str;

}

然后上传/保存

public function upload($dir=null) {
    // max file size in bytes
    $size = Configure::read ('AMU.filesizeMB');
    if (strlen($size) < 1) $size = 20;
    $relPath = Configure::read ('AMU.directory');
    if (strlen($relPath) < 1) $relPath = "files";

    $sizeLimit = $size * 1024 * 1024;
            $this->layout = "ajax";
        Configure::write('debug', 0);
    $directory = APP . DS . $relPath;

    if ($dir === null) {
        $this->set("result", "{\"error\":\"Upload controller was passed a null value.\"}");
        return;
    }
    // Replace underscores delimiter with slash
    $dir = str_replace ("___", "/", $dir);
    $dir = $directory . DS . "$dir/";
    if (!file_exists($dir)) {
        mkdir($dir, 0777, true);
    }
    $uploader = new qqFileUploader($this->allowedExtensions, 
        $sizeLimit);
    $result = $uploader->handleUpload($dir);
    $this->set("result", htmlspecialchars(json_encode($result), ENT_NOQUOTES));
}

与原来的插件相比,唯一真正的改变是把WWWROOT改成APP来进行切换。保存效果很好,很可爱。但奇怪的是我可以在视图中读取文件名、文件大小没有问题但无法查看图像、pdf等。

【问题讨论】:

    标签: cakephp


    【解决方案1】:

    问题:

    您不能通过直接 URL 显示位于 webroot 之外的文件 - 这就是首先将它们放在 webroot 之上的全部意义 - 使它们无法直接访问。

    因此,首先在控制器中构建图像 src 路径(无论如何都不是好的做法)不会改变这样一个事实,即当该路径到达浏览器时,它会读取图像的源代码,因为它试图从上方拉取图像webroot,它不会/不能。

    解决方案:

    解决方案是使用CakePHP's Sending files(以前是Media Views)。然后,将 img 的“src”设置为控制器/动作。在那个动作中,它基本上说“将此动作显示为图像”(或 pdf 或其他任何内容)。

    在控制器中使用的路径:

    从我的一个完全执行上述操作的应用程序中获取此文件,这是我用于“文件”中的文件的路径(与 webroot 相同的级别):

    file_exists(APP . 'files' . DS . $your_filename)
    

    【讨论】:

    • 优秀。这是我一直在寻找的缺失部分。
    【解决方案2】:

    在 webroot 内创建一个指向您的文件夹的符号链接 ;-)

    【讨论】:

    • 这首先破坏了将文件放在 webroot 之外的整个目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2015-12-07
    相关资源
    最近更新 更多