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