Скрыть прямой файл url в symfony - PullRequest
0 голосов
/ 08 апреля 2011

Я использую tcpdf для генерации отчета в формате pdf. Я сохранил эти файлы отчетов в корневой директории. Затем я отображаю PDF, перенаправляя на эту страницу, как

Код: Выбрать все http://sitename/pdf/student_record.pdf

Я не хочу раскрывать имя каталога pdf и имя файла. Я хочу установить дубликат имени для этого из соображений безопасности. Как я могу сделать это с помощью routing.yml?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2011

Я должен был сделать что-то, что вы хотели бы иметь.Итак, я расширил sfActions с помощью myActions и добавил метод:

/**
 *
 * @param string $path
 * @param string $mimetype
 * @return sfView::NONE
 */
public function downloadFile($path, $mimetype, sfRequest $request) {
    if (is_file($path) && is_readable($path)) {
        $this->setLayout(false);
        sfConfig::set('sf_web_debug', false);
        $this->getResponse()->clearHttpHeaders();
        $this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename="' . basename($path) . '"');
        $this->getResponse()->setHttpHeader('Content-type', $mimetype);
        $this->getResponse()->setHttpHeader('Pragma: public', true);
        $this->getResponse()->setHttpHeader('Expires', 0);
        $this->getResponse()->setHttpHeader('Content-Transfer-Encoding', 'binary');
        $this->getResponse()->setHttpHeader('Content-Length', filesize($path));
        $this->getResponse()->sendHttpHeaders();
        file_put_contents(sfConfig::get('sf_upload_dir').'/test.txt', var_export($_SERVER, 1) . 'TEST');
        if($request->isMethod(sfRequest::HEAD))
            $this->getResponse()->setContent('');
        else
            $this->getResponse()->setContent(file_get_contents($path));
    }
    else
        $this->forward404('Unreadable file', 'json');

    return sfView::NONE;
}

и использовал этот метод для действий от маршрутизации.Например, у нас есть модель Author и mp3 для нее.Итак, в routing.yml:

author_show:
  url:       /api/authors/:id.:sf_format
  class:     sfDoctrineRoute
  options:   { model: Author, type: object }
  param:     { module: author, action show }
  requirements:
    sf_format: (?:mp3)

В действии:

switch($request->getParameter('sf_format')) {
        case 'mp3':
            $path = sfConfig::get('sf_upload_dir') . '/authors/audio/' . $author->getAboutAudio();
            $mimetype = 'audio/mpeg';
            break;

        default:
            $this->forward500('Unknown format. Only mp3 format is available.', 'json');
    }
    return $this->downloadFile($path, $mimetype, $request);

Кроме того, вы можете сохранить его в некоторой подпапке при загрузке и защитить его с помощью .htaccess, например

deny from all
0 голосов
/ 08 апреля 2011

Вы не должны использовать Symfony для загрузки файлов, в то время как ваш веб-сервер может сделать это напрямую. Например, сохраните ваши файлы во внешнем каталоге, например / path / to / pdf, затем на своем виртуальном хосте добавьте:

Alias /pdf /path/to/pdf

Если вы также хотите изменить имя, вы можете использовать какое-то правило перезаписи.

0 голосов
/ 08 апреля 2011

Сохраните pdf вне webroot, затем создайте маршрут и действие, которое проверяет, может ли пользователь получить к нему доступ, затем устанавливает правильные заголовки для файла pdf и выводит его через fpassthru() или readfile().

...