Отправить файл с помощью php без предоставления каталога - PullRequest
0 голосов
/ 29 апреля 2019

Это мои настройки:

Web Server: Apache/2.4.25
Web structure:
 /
 |__Video/
         |__ test.mp4
 |__play.php

В настоящее время я выставляю все свои видео на своем сервере, помещая непосредственно каталог видео в каталог apache.

Что я хочу получить, так этопереместите видео за пределы каталога Apache (предположим, нет проблем с разрешениями) и передайте только запрошенное видео через запрос GET в play.php, например: GET play.php?req=test.mp4

В настоящее время я написал следующий код:

$name = $_GET['req']
header('Accept-Ranges: bytes');
header('Content-Length: ' . filesize($name));
header('Content-Type: ' . mime_content_type($name));
header('Content-Disposition: filename="'.$name.'"');
readfile($name);
exit;

Чего не хватает?Почему при попытке получить доступ к файлу с помощью play.php появляется сообщение «Нет поддерживаемых носителей видео»?Используя «mysite.com/Video/test.mp4», я могу без проблем обращаться к медиафайлам напрямую.

Я понял, что если я подожду достаточно долго, браузер полностью загрузит файл и воспроизведет его.Чего я не могу получить, так это потокового файла.

1 Ответ

0 голосов
/ 30 апреля 2019

Я нашел проблему и возможное решение.

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

В случае, если вы используете Debian как я, достаточно:

  • Установите его: sudo apt-get install libapache2-mod-xsendfile
  • Измените свой сайт conf (путь по умолчанию: /ect/apache2/sites-available), добавив в начале следующие строки (или в выбранный VirtualHost):
XSendFile on
XSendFilePath /full/path/to/directory1
XSendFilePath /full/path/to/directory2
  • Перезагрузите веб-сервер: sudo systemctl reload apache2 && sudo systemctl restart apache2
  • Обновите скрипт php следующим образом:
$name = "/full/path/to/directory1/".$_GET['req']
header('Accept-Ranges: bytes');
header('Content-Length: ' . filesize($name));
header('Content-Type: ' . mime_content_type($name));
header('Content-Disposition: filename="'.$name.'"');
header('X-Sendfile: $name');

Для получения дополнительной информации я предлагаю вам посетить эту страницу .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...