У меня есть папка, которая содержит загруженные документы, которые может использовать мое приложение ZF для входа в систему. Я хочу, чтобы они могли использовать ссылку, такую как http://server/documents/filename.pdf
и загрузить файл, но я хочу иметь контроллер DocumentsController
который позволяет существующим куки-файлам пользователей проверять, что они вошли в систему, и разрешение на загрузку файла. Я не хочу использовать URL-адреса, такие как http://server/documents/index/id/1
если мне это не нужно, хотя это не ужасный вариант.
Вы можете использовать X-SendFile для получения наилучшей производительности. Он поддерживается Apache (mod_xsendfile), Lighttpd и Nginx. Запрос сначала обрабатывается процессом php, который помещает специальный заголовок (X-Sendfile или X-Accel-Redirect для Nginx), а когда сценарий заканчивается, веб-сервер берет на себя и отправляет файл как статический файл. Это быстрее и использует меньше памяти.
Чтобы перенаправить весь запрос на ваш контроллер, вам нужно написать собственный маршрут в своем бутстрапе:
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, и вам нужно иметь код для проверки подлинности пользователя.
Вам нужно будет использовать Zend_Acl для управления доступом к DocumentsController
а затем создать собственный маршрут для перенаправления http://server/documents/*
на http://server/documents/index/id/*
.
Решение, предложенное Tomáš, будет работать лучше для больших файлов.