Хорошо, если php отправлять файлы размером около 400 МБ-10 ГБ, это не хорошо. Вам нужно каким-то образом разрешить любому используемому веб-серверу обслуживать файлы.
Это действительно сводится к тому, насколько безопасным вам это нужно. Самым простым решением, которое приходит на ум (но далеко не самым безопасным), является использование символических ссылок с длинными случайными именами, которые ссылаются на исходный файл. Через некоторое время символические ссылки истекают и удаляются. Каждый пользователь получает свою символическую ссылку (или «токен») на загружаемый файл. Я не уверен, как это работает в Windows-среде, но в Unix все равно довольно просто.
Вот некоторый псевдокод:
if($user->isAllowedToDownload($file)){
$token = md5($user->name . $file->name . time() . $someGoodRandomValue);
symlink($file, $download_path . $token);
header("Location: $download_url$token");
}
Тогда вам нужна работа cron, которая очищает старые символические ссылки. Вам также необходимо убедиться, что веб-сервер настроен на переход по символическим ссылкам, желательно только для той папки, где создаются эти токены загрузки.
Поэтому, когда пользователь может запросить domain.com/download?file=bigfile.mp4
, в публичном пространстве веб-сервера создается символическая ссылка, которая указывает на реальный файл за пределами публичного пространства веб-сервера. Пользователь перенаправляется на возможно domain.com/getFile/ab739babec890103bdbca72
, что, в свою очередь, заставляет веб-сервер обслуживать файл. Теперь пользователям очень сложно угадать, что такое URL для файла, и это «безопасность».