1

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

4

2 回答 2

3

您可以使用 X-SendFile 来获得最佳性能。它由 Apache (mod_xsendfile)、Lighttpd 和 Nginx 支持。该请求首先由一个 php 进程处理,该进程放置一个特殊的标头(X-Sendfile 或 Nginx 的 X-Accel-Redirect),当脚本结束时,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并且您需要有代码来检查用户是否经过身份验证。

于 2010-10-05T08:11:08.267 回答
0

您必须使用Zend_Acl来控制对 的访问DocumentsController,然后创建自定义路由以重定向http://server/documents/*http://server/documents/index/id/*.

编辑:

Tomáš 提出的解决方案对于更大的文件效果更好。

于 2010-10-04T18:44:22.620 回答