Спасибо за ответы каждого.
На самом деле я решил проблему, не раскрывая путь к аудиофайлу для пользователя.
Поскольку это приложение для голосовых сообщений в Интернете, важно защитить путь к сообщениям, чтобы защитить конфиденциальность пользователя.
Ситуация в конечном итоге осложняется тем фактом, что сообщения хранятся на удаленном сервере ... выяснил это сразу после того, как я опубликовал этот вопрос.
Итак, в целом процесс был:
1) Свернуть MP3-файл с удаленного сервера
2) Установите некоторые заголовки для принудительной загрузки данных, которые затем выведите на стандартный вывод
Поскольку данные выводятся стандартным образом и заголовки настроены для принудительной загрузки, эффект для jPlayer такой же, как если бы он запросил файл в /some/dir/message.mp3, за исключением того, что запрос идет в /some/dir/playmessage.php - таким образом, путь никогда не раскрывается пользователю.
РЕДАКТИРОВАТЬ ** - Предположим, что у меня есть контроль доступа, проверка выполняется до фрагмента ниже, в противном случае раскрытие пути к приведенному ниже сценарию ничем не отличается от простого указания пути к mp3. (см. комментарии между мной и Ллойдом)
Вот код, который закончил работу:
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
echo 'CURL Failed';
exit;
}
//Get file size
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
$contentLength = (int)$matches[1];
}
//force user to download file contents
header('Content-Transfer-Encoding: binary');
header('Content-Type: audio/mpeg');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Content-Length: ' . $contentLength);
ob_clean();
flush();
echo $data;
exit;
?>
Предположим, что $remoteFile
- это путь к mp3-файлу, который я хочу воспроизвести на сервере, где мы храним сообщения.
Я нашел этот ресурс для чтения удаленного файла с использованием PHP особенно полезным. Вот еще немного информации о изменении заголовков http .
ПРИМЕЧАНИЕ Я загружаю файл дважды, что замедляет процесс для пользователя. Вероятно, есть лучший способ сделать это. :) Если вы сохранили файл локально, то, что у меня изначально было в моем вопросе, на самом деле работает (используя readfile () для вывода необработанных данных mp3).