Контроль доступа к файлам, доступным для скачивания - PullRequest
1 голос
/ 04 октября 2010

У меня есть папка с загруженными документами, которые мое приложение ZF может выплевывать для зарегистрированных пользователей.Я хочу, чтобы они могли использовать ссылку типа http://server/documents/filename.pdf и загружать файл, но я хочу иметь контроллер DocumentsController, который позволяет существующим пользовательским файлам cookie проверять, что они вошли в систему, и иметь разрешение на загрузку файла.Я не хочу использовать URL-адреса, такие как http://server/documents/index/id/1, если это не нужно, хотя это не страшный вариант.

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

Вы можете использовать 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, и вам нужен код для проверки подлинности пользователя.

0 голосов
/ 04 октября 2010

Вам придется использовать Zend_Acl для управления доступом к DocumentsController, а затем создать пользовательский маршрут для перенаправления http://server/documents/* на http://server/documents/index/id/*.

Редактировать:

Решение , предложенное Томашем , будет работать лучше для больших файлов.

...