сервер — Php Проблемы с потоковым MP3

У меня очень странная проблема, когда я пытаюсь транслировать музыку с помощью php с моего локального сервера. У меня есть базовые проверки авторизации имени пользователя / пароля, чтобы убедиться, что у пользователя есть правильные разрешения для потоковой передачи файла. Проблема заключается в этих проверках, хотя.

Я использую функцию выхода php, чтобы прервать сценарий, если у пользователя нет разрешения на просмотр файла, и echo, чтобы уведомить пользователя. Функция выхода, по-видимому, прерывает потоковую передачу, даже если она не выполняется.

Вот основные моменты моего кода:

    function hasPermission($user,$perm)
{
if (!accountHasPermission($user,$perm) )
{
echo "<center><a style='color:indianred'>Failed to Authenticate: 1";
echo "<br><br><a href='javascript:history.back()'>Go Back</a>";

exit;
}
}

function streamTest()
{
$filename = "uploads/path_to_file";

if(file_exists($filename)){
header('Content-type: audio/mpeg');
header('Content-Disposition: filename=' . basename($filename) );
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile( $filename );
}else{
header("HTTP/1.0 404 Not Found");
}
}

hasPermission($_POST["username"],"manageFilesWeb");

streamTest();
exit;

Если я закомментирую выходной вызов в функции hasPermission, звук будет воспроизводиться без проблем. Используя хром, я получаю хороший аудиоплеер, который выглядит как этот. Конечно, функция выхода никогда не будет вызвана, потому что я использую учетную запись с правильными разрешениями. Я на 100% уверен в этом. Если функция выхода не закомментирована, музыкальный файл не будет транслироваться на Chrome, и аудиоплеер будет выглядеть этот. Я пробовал несколько браузеров Chrome и всегда получаю одинаковые результаты. Тем не менее, музыка будет воспроизводиться в браузере Firefox независимо от того, была ли строка комментария закомментирована или нет.

Я пробовал различные другие варианты, такие как использование return, die, if / else, но все даст мне те же результаты.

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

Я дошел до того, что понятия не имею, что происходит. Я уже должен был удалить простые проверки if / else, потому что они прерывали процесс потоковой передачи, но я дошел до того, что значительно уменьшу безопасность, если уберу больше.

Обновить: Я нашел проблему. Проверка авторизации является проблемой. Я предполагаю, что во время передачи файла данные _POST не определены, что приводит к сбою моих проверок авторизации. Есть ли способ получить имя пользователя и пароль во время потоковой передачи файла, чтобы избежать этого?

  • Похоже, что Firefox постоянно отправляет данные _POST, что позволяет проходить проверки и поддерживать поток файлов живым. В то время как хром, кажется, просто отправить его один раз.

0

Решение

Для такого рода аутентифицированного использования файлов sendfile метод уважаемых веб-серверов, за которыми работает ваше php-приложение, который говорит, что есть два популярных веб-сервера,

1. Apache

Для Apache включить xsendfile модификация
здесь при первом прочтении логина & пароль с использованием отдельного login.php

  // login.php
// session_start & stop life cycle codes
username = $_POST["username"];
password = $_POST["password"];
if(hasPermission(username, password){
$_SESSION["logined"] = true; // setting a session value for successful authentication
}
// login success

Затем добавьте файл php файл для потокового файла, скажем file.php

 //file.php
if(isset($_SESSION["logined"])){
$filename = "uploads/path_to_file"; // absolute path to file
header('Content-type: audio/mpeg');
header('Content-Disposition: filename=' . basename($filename) );
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
header('X-Sendfile', $filename);
}else{
header("HTTP/1.0 404 Not Found"); // or 401 Unauthorized
}

2. Nginx

Для использования сервера nginx выполните шаги, описанные в разделе apache, за исключением замены X-Sendfile с X-Accel-Redirect, проверять Вот для более подробного объяснения, относящегося к nginx xsendfile.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector