3

私はこのコードを持っています:

if  (isset($_GET['file']) && isset($_GET['name']))
{

    $ch = curl_init($file);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);

    $data = curl_exec($ch);
    curl_close($ch);

    if (preg_match('/Content-Length: (\d+)/', $data, $matches)) 
    {
        // Contains file size in bytes
        $contentLength = (int)$matches[1];
    }

    header("Content-type: application/x-file-to-save");
    header("Content-Disposition: attachment; filename=".$_REQUEST['name']);
    header('Content-Length: ' . $contentLength);
    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');
    header('Connection: Keep-Alive');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0', false);
    header('Cache-Control: private', false);

    readfile($file);
}

問題は、$file が別のサーバーにあることです。このダウンロードの再開を有効にするにはどうすればよいですか? ありがとう!

4

1 に答える 1

0

カールを変更してボディも引き込みます (NOBODY オプションを削除します)。

次に、返されたコンテンツ ($data) をヘッダーと本文に分割できます - 分割は最初の空白行です (行に 2 つのキャリッジ リターンがあることを確認してください - これより上にあるものがヘッダーで、下にあるものが本文です)。それらを変数 $header と $body に入れます。

$header で preg_match を実行します。

残りを出力するには、単純に「echo $body」、または再開可能なダウンロードの場合は substr($body, $startpos) を実行します。


再開可能なダウンロード: ファイルが大きい場合は、ローカルにキャッシュすることをお勧めします。(つまり、「$body」をローカル ファイルに保存し、ローカル ファイルで readfile を使用します。次に、ファイルを開き (fopen)、適切な場所に移動し (fseek)、読み取り (fread) /そこから残りをエコー (エコー) します。開始点が見つかったら、fpassthru も同じことを行う必要があります。

また、他人のコンテンツを自分のものとして偽装しようとしている場合は、最初に許可を取得してください;) (それ以外の場合は、単にユーザーをその別の URL に誘導して、帯域幅を節約してください)

于 2012-07-05T04:44:22.990 に答える