Пользовательское изменение маршрута для URL загрузки - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь изменить маршрут загрузки файла, чтобы он мог оставаться защищенным, добавив несуществующую папку "/ protected /"

Мой реальный путь

"/ Var / WWW / HTML / вар / добавления / Заявления / 2019-06 / экспорт 1.csv"

и в конце мне нужно, чтобы это было:

"http://app.local:8080/protected/uploads/Statements/2019-06/export-1.csv"

Я пробовал разные версии, но мой код не возвращает требуемый путь.

Может помочь с редактированием моего кода:

    $file = realpath($file);
    $projectDir = $this->container->get('kernel')->getProjectDir();
    $webDir = realpath($projectDir);
    $finalPath = substr($file, strlen($webDir));

    $request = $this->container->get('request_stack')->getCurrentRequest();

    $downloadUrl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath() . '/' . $finalPath;

    return $downloadUrl;

$ downloadUrl работает как надо, но $ finalPath не отформатирован.

1 Ответ

1 голос
/ 10 июня 2019

Вместо того, чтобы хранить свои загрузки в папке public/, вы должны хранить их где-нибудь за пределами корневого каталога общедоступных документов веб-сервера, поскольку это представляет потенциальную угрозу безопасности, то есть кто-то может получить их, не пройдя через механизм.Например, вы можете иметь каталог рядом с public/ с именем data/uploads.Это обеспечит недоступность файлов веб-сервером.

В вашем проекте Symfony вы можете создать DownloadController, который принимает путь или имя файла в качестве аргумента, а затем добавляет его в папку:

class DownloadController extends AbstractController
{
    // This should be the path you store your files in
    private $uploadDir;

    public function __construct(string $uploadDir)
    {
        $this->uploadDir = $uploadDir;
    }

    /**
     * @Route("/protected/uploads/{file}", name="download", requirements={"file"=".+"})
     */
    public function index(string $file)
    {
        return new BinaryFileResponse($this->uploadDir . $file);
    }
}

См .: https://symfony.com/doc/current/routing/slash_in_parameter.html и https://symfony.com/doc/current/components/http_foundation.html#serving-files

Возможно, вам придется выполнить некоторые проверки и проверки работоспособности, например, когда файл отсутствует или кто-то хочет заставить вас загрузить что-то за пределы базыкаталог, но примерно это должно быть.

Теперь вместо создания псевдоссылок в вашем приложении вы можете просто позвонить, например, в своем шаблоне:

{{ path('download', { 'file': 'Statements/2019-06/export-1.csv' }) }}

Это создаст правильную загрузкуссылка внутри вашего приложения.Вы также можете создать сопоставление из виртуального имени файла, например, хэша с фактическим именем файла внутри этого действия контроллера.Вы только должны отслеживать ссылки как-то.Вы также можете добавить проверки доступа или счетчики загрузки для этого действия.

Напомним, что если ваш проект находится в /var/www/myproject, общий каталог веб-сервера - /var/www/myproject/public/, а ваши файлы хранятся в /var/www/myproject/data/uploads/,Загруженный файл находится в /var/www/myproject/data/uploads/Statements/2019-06/export-1.csv, и URL будет выглядеть так: http://app.local:8080/protected/uploads/Statements/2019-06/export-1.csv.Изменяя путь к аннотации маршрута, вы можете просто настроить URL, не перемещая один файл.

...