я должен разрешить пользователю передавать его только без загрузки для этого файла, как я могу это сделать? другой вопрос этот код у меня проблема, файл сначала загружается, а затем воспроизводится?
<?php $file = isset($_GET['q']) ? dirname(__FILE__) . base64_decode($_GET['q']) : false; $file = urldecode(str_replace('/', '\\', $file)); $download = isset($_GET['d']) ? $_GET['d'] == 't' ? true : false : false; if ($file) { $disabelStr = 'DisableTrackDownload-'; $pattern = '/'.$disabelStr.'/'; $disableDownload = preg_match($pattern,$file); $isFile = is_file($file); // check if file exists if($isFile){ // Getting headers sent by the client. $headers = apache_request_headers(); if(isset($headers['Connection'])){ // stream audio files header("Content-Type: audio/mpeg"); header('Content-Length:'.filesize($file)); header('Content-Disposition: inline; filename="stream.file"'); header('X-Pad: avoid browser bug'); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Expires: -1"); ob_clean(); flush(); readfile($file); }else{ // disable download header ("HTTP/1.0 404 Not Found"); } exit; } } ?>
Часть 1: Потоковая передача в целом.
«Поток MP3» отличается от загрузки HTTP. Для правильного потока требуется потоковый медиа-сервер (например, Shoutcast) и часто является транскодированной версией прямой трансляции или версией большого звукового файла по требованию, где воспроизведение может начинаться немедленно, а не ждать, пока весь файл будет загружен.
Обслуживание файлов MP3 через HTTP не является «потоковой» поддержкой, даже если клиент (например, Winamp, Quicktime Player и т. Д.) Способен воспроизводить файл перед его загрузкой.
С этой целью вы не можете передавать потоки MP3 из PHP по причинам, которые должны быть очевидными (например, PHP является «недолговечным» процессом и не предназначен для долговременных запросов, таких как потоки поверх HTTP).
Сценарий, который вы описываете, предлагает стандартные загрузки HTTP файлов MP3, но с использованием клиентов, которые могут сразу начать воспроизведение. Обратите внимание, что благодаря работе клиентов (в целом) вы не можете запретить пользователям сохранять загруженный файл.
Я предполагаю, что вы можете ограничить доступ к известным клиентам (через заголовок User-agent
), но это пример того, как быть злым. Пожалуйста, не делайте ничего подобного.
Часть 2: Ваш код
Ваш PHP-код использует заголовок Content-disposition
чтобы намекнуть браузеру, что файл должен быть загружен в файловую систему, а не URL, переданный во внешнюю программу или плагин. Удалите заголовок, и вы обнаружите, что некоторые браузеры запустит MP3-плеер, но другие все равно попросят пользователя сохранить файл на диск (обычно из-за предпочтений пользователя или, возможно, из-за отсутствия установленного MP3-плеера).
Кроме того, не используйте HTTP 404 для отказа в запросе. Используйте HTTP 403 Forbidden
который более точно описывает, что вы делаете.