Вместо того, чтобы хранить свои загрузки в папке 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, не перемещая один файл.