控制对可供下载的文件的访问

时间:2010-10-04 18:23:28

标签: php zend-framework .htaccess zend-controller

我有一个文件夹,其中包含我的ZF应用程序可以向登录用户吐出的上传文档。我希望他们能够使用http://server/documents/filename.pdf之类的链接并下载文件,但我希望有一个控制器DocumentsController,使现有的用户cookie能够验证他们是否已登录并拥有权限下载文件。如果我不需要,我不想使用像http://server/documents/index/id/1这样的网址,尽管这不是一个糟糕的选择。

2 个答案:

答案 0 :(得分:3)

您可以使用X-SendFile获得最佳性能。它受Apache(mod_xsendfile),Lighttpd和Nginx的支持。该请求首先由一个php进程处理,该进程放置一个特殊的头文件(X-Sendfile或X-Accel-Redirect for Nginx),当脚本结束时,Web服务器接管并像静态文件一样发送文件。它更快,使用更少的内存。

要将所有请求重定向到控制器,您需要在引导程序中编写自定义路由:

protected function _initRouter()
{
    $router = Zend_Controller_Front::getInstance()->getRouter();

    $documentRoute = new Zend_Controller_Router_Route(
        'document/:filename',
        array(
            'action'     => 'xsendfile',
            'controller' => 'documents'
        ),
        array(
            'filename' => '\..+$'
        )
    );
    $router->addRoute('document', $documentRoute );

    return $router;
}

您可以使用此操作助手来处理x-sendfile标头:http://www.zfsnippets.com/snippets/view/id/27,您需要使用代码来检查用户是否经过身份验证。

答案 1 :(得分:0)

您必须使用Zend_Acl来控制对DocumentsController的访问权限,然后创建custom route以将http://server/documents/*重定向到http://server/documents/index/id/*

编辑:

solution proposed by Tomáš可以更好地处理更大的文件。