Я создаю хранилище файлов с веб-интерфейсом. Пользователи смогут войти в систему (простая система авторизации PHP) и просматривать свои файлы, хранящиеся на сервере. У каждого каталога есть имя, которое определяет, к какому пользователю он принадлежит.
Я борюсь за безопасность всего этого — я не могу просто выбросить все файлы в корень документа, потому что каждый сможет получить к ним доступ. Все ответы, связанные с этой проблемой, предполагают, что все личные и конфиденциальные данные должны быть размещены за пределами корня документа.
Это то, что я сделал, но теперь я не могу найти способ показать эти файлы пользователю, когда он входит в систему.
Как мне подойти к этой проблеме? Хранить их в базе данных как BLOB — плохая идея, потому что каждый файл имеет более 1,5 ГБ.
Тот факт, что это видеофайлы, которые будут воспроизводиться с помощью плагина javascript, также важен — они должны быть доступны непосредственно браузеру пользователя.
ОБНОВИТЬ
Для тех, кто борется с той же проблемой:
Я сделал как шериф предложил в своем ответе. Вам необходимо установить mod_xsendfile и добавить
XSendFile On
XSendFilePath "/var/www/"
в ваш файл конфигурации Apache в <Directory>
раздел. Конечно, измените путь в соответствии с вашими потребностями. Затем создайте файл PHP, который будет обрабатывать запросы. Вот пример PHP-подобного псевдокода:
$file = $_GET["file"];
if (user_logged_in() && user_allowed_to_download($file)){
$absoluteFilePath = "/var/www/".$file;
header("X-Sendfile: ".$absoluteFilePath);
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$file);
}
Затем вы можете использовать его с jwplayer, VLC и т. Д., Например:
<div class="embed_vlc_wrapper">
<embed type="application/x-vlc-plugin" pluginspage="http://www.videolan.org" version="VideoLAN.VLCPlugin.2"width="500"height="500"version="VideoLAN.VLCPlugin.2"target="http://localhost/xsend.php?file=1.mp4"pluginspage="http://www.videolan.org"/>
</div>
Если вы хотите, чтобы пользователь прошел через ваш PHP для аутентификации и получил доступ к файлу вне корня документа, это нормально. Просто выполните обычную аутентификацию, и тогда вы сможете использовать X-Sendfile
заголовок, чтобы ваш веб-сервер обслуживал файл из любой точки вашей файловой системы. Информацию о том, как включить sendfile, смотрите в документации к вашему веб-серверу: например, Apache httpd, Nginx
Итак, вот основная идея …
if (isset($_SESSION['user_authenticated'])) { // or however you verify the user
header('X-Sendfile: ', $pathToFileForDownload); // your web server will do the rest
}
Других решений пока нет …