0

ユーザーがそのファイルをダウンロードせずにストリーミングできるようにする必要があります。どうすればそれを行うことができますか? 別の質問このコードには、ファイルが最初にダウンロードされてから再生されるという問題がありますか?

<?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;
}
}
?>
4

1 に答える 1

4

パート 1: ストリーミング全般。

「MP3 ストリーム」は HTTP ダウンロードとは異なります。適切なストリームには、ストリーミング メディア サーバー (Shoutcast など) が必要であり、多くの場合、ライブ ブロードキャストのトランスコード バージョンまたは大きなオーディオ ファイルのオンデマンド バージョンであり、ファイル全体がダウンロードされるのを待つのではなく、すぐに再生を開始できます。

クライアント (Winamp、Quicktime Player など) がダウンロード前にファイルを再生できる場合でも、HTTP 経由で MP3 ファイルを提供することは、真の「ストリーミング」とは言えません。

そのため、明らかな理由により、PHP から MP3 ストリームを提供することはできません (つまり、PHP は「存続期間の短い」プロセスであり、streams-over-HTTP などの存続期間の長い要求には対応していません)。

あなたが説明しているシナリオは、MP3 ファイルの標準的な HTTP ダウンロードを提供していますが、すぐに再生を開始できるクライアントを使用しています。クライアントの動作 (一般的に) により、ダウンロードしたファイルの保存を止めることはできないことに注意してください。

(ヘッダーを介して)既知のクライアントへのアクセスを制限できると思いますがUser-agent、それは悪の例です。このようなことはしないでください。


パート 2: コード

PHP コードはContent-dispositionヘッダーを使用して、外部プログラムまたはプラグインに渡される URL ではなく、ファイルをファイル システムにダウンロードする必要があることをブラウザーに示唆します。ヘッダーを削除すると、一部のブラウザーは MP3 プレーヤーを起動することがわかりますが、他のブラウザーはファイルをディスクに保存するようにユーザーに促します (通常はユーザーの設定によるか、MP3 プレーヤーがインストールされていないため)。

また、HTTP 404 を使用して要求を拒否しないでください。HTTP 403 Forbiddenあなたがしていることをより正確に説明するものを使用してください。

于 2012-07-14T18:42:27.683 に答える