7

私は、ユーザーがダウンロード再開で大きなファイルをダウンロードできるようにするphp-scriptを持っています。

これは正常に機能しますが、phpコードを使用したダウンロード速度を接続あたり200kb/sに制限しました。

したがって、Mozillas Firefoxダウンロードマネージャーは1つの接続のみを行い、速度は約200kb / sですが、Free-Download-ManagerまたはJDownloaderは2〜4の接続を行うため、ダウンロード速度は(200Kb / s * 2または4)= 400〜 800kb/s。

これを停止して、すべてのユーザーがこのファイルをダウンロードできるように接続を1つだけ許可するにはどうすればよいですか?

4

1 に答える 1

7

A. _ あなたにとって最初のことは無効にすることだと思いますContent-Range..

14.16 コンテントレンジ

Content-Range エンティティ ヘッダーは、完全なエンティティ ボディのどこに部分ボディを適用するかを指定するために、部分エンティティ ボディとともに送信されます。範囲単位は、セクション 3.12 で定義されています。

ダウンロード マネージャーは、範囲の関係で 2 つまたは複数の接続で 1 つの罰金をダウンロードできます..これを両方無効にするdownload resumemultiple connections、1 つのファイルで作成することはできません。彼らはファイルへのすべてのリクエストを最初から始めます

LoadModule headers_module modules/mod_headers.so 
Header set Accept-Ranges none 
RequestHeader unset Range

14.35.1 Byte Rangesも参照してください。

B. _ ダウンロード セッションを紹介します。

uniqid idダウンロードごとにを生成し、 PHP ページ経由で提供できます。ダウンロードがまだアクティブであるか、ページを表示する前に要求された場合

$realFile = "test.pdf";
$fakeFile = uniqid("file");

$uniqid = isset($_REQUEST['id']) ? $_REQUEST['id'] : null;
if (empty($uniqid) || strlen($uniqid) < 20 || !ctype_xdigit($uniqid)) {
    die("Die! Die! Die! Stolen URL");
}
$memcache = new \Memcache();
$memcache->connect('localhost', 11211);

$runtime = (int) $memcache->get($uniqid);

if ($runtime) {
    die("Die! Die! Die! You Multiple Down loader");
} else {
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Content-Transfer-Encoding: binary");
    header("Content-disposition: attachment; filename=$fakeFile.pdf"); //
    header('Content-type: application/pdf');
    header("Content-length: " . filesize($realFile));
    readfile($realFile);
    $memcache->set($uniqid, 1);
}

シンプル クライアント

$url = "a.php?id=" . bin2hex(mcrypt_create_iv(30, MCRYPT_DEV_URANDOM));
printf("<a href='%s'>Download Here</a>",$url);

次のような出力になります

<a href='a.php?id=aed621be9d43b0349fcc0b942e84216bf5cd34bcae9b0e33b9d913cccd6e'>Download Here</a>

また、各IDを特定のファイルにマップする必要があります...

于 2012-10-15T19:34:24.937 に答える