Symfony 2.7 доступ к изображению за пределами веб-каталога


Я прочитал много статей об этой проблеме, но, похоже, ответа на этот вопрос пока не должно быть.

So my project directory is like :
+ uploads_dir
+ symfony_proj
    - app
    - bin
    - src
    - vendor
    - web

Я хочу получить изображение внутри uploads_dir, чтобы использовать его на своей странице просмотра

Я создал расширение twig, которое извлекает каталог roor.. но, похоже, оно не читается, если я добавлю "root_dir". "../../uploads_dir".

Есть какие-нибудь предложения?

Вот часть расширения моей ветки:

/**
     * @var container
     */
    protected $container;

    public function __construct(ContainerInterface $container){
        $this->container = $container;
    }

public function bannerFilter($filename)
    {
        $file = $this->container->getParameter('kernel.root_dir').'../../uploads_dir'.$filename;

    }
Author: ckkaqa, 2016-02-18

2 answers

Я бы сделал так, чтобы получение ресурса проходило через функцию, это также позволяет вам выполнять любые другие проверки (например, вошел ли пользователь в систему и т. Д.).
Создайте действие контроллера, которое обрабатывает запрос, а затем в своей ветке вы можете просто использовать обычную функцию path().
Некоторый пример кода; параметры.yml

parameters:
    upload_destination: '%kernel.root_dir%/../../uploads_dir'

Пример функции;

public function getFileAction($file_name)
{
    $base_path = $this->container->getParameter('upload_destination');
    $full_path = $base_path . '/' . $file_name;

    $fs = new FileSystem();
    if (!$fs->exists($full_path)) {
        throw $this->createNotFoundException();
    }

    $file_name = basename($full_path);
    $mime_type = $this->getMimeType($full_path);

    $file = readfile($full_path);
    $headers = array(
        'Content-Type'     => $mime_type,
        'Content-Disposition' => 'inline; filename="'.$file_name.'"');
    return new Response($file, 200, $headers);
}

protected function getMimeType($file)
{
    if ('jpg' === substr($file, -3)) {
        $best_guess = 'jpeg';
    } else {
        $guesser = MimeTypeGuesser::getInstance();
        $best_guess = $guesser->guess($file);
    }

    return $best_guess;

}

В твоей веточке;

<img src="{{ path('whatever_you_called_your_route', {'file_name': 'my_file.jpg'}) }}" />
 3
Author: Rooneyl, 2016-02-18 09:21:41

Я передал это с помощью /uploads_dir/. Я надеюсь, что это поможет.

 0
Author: DrevanTonder, 2016-02-18 09:12:26