1

だから私はこの記事を使って私のウェブサイトのダウンロードリンクを生成して保護しています

私が抱えている問題は、巨大なファイルではなく、スクリプトが機能することです。たとえば、1GB のファイルは完全にダウンロードされますが、7GB のファイルはそうではありません。

コメントの誰かが、大規模なダウンロードがこれを引き起こす可能性があると述べました.

現在、私のヘッダーは次のようになっています。

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($fakefilename) . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($realfilename));
ob_clean();
flush();
readfile($realfilename);
exit;

そして、このガイドは、それらが次のように見えるべきであることを示唆しています:

header("Content-Disposition: attachment; filename=" . urlencode($file));    
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");             
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.

$fp = fopen($file, "r"); 
while (!feof($fp))
{
    echo fread($fp, 65536); 
    flush(); // this is essential for large downloads
}  
fclose($fp); 

私の人生では、これを機能させることはできません。HTTP ヘッダーに精通していて、大きなファイルをダウンロードできないが、小さなファイルをダウンロードできない人はいますか?

どんな助けでも大歓迎です。前もって感謝します!

4

1 に答える 1

1

このエラーは、filesize呼び出しがシステム PHP_MAX_INT をオーバーフローさせ、ファイル全体の長さよりも短い長さになることが原因で発生します。(32ビットマシンで約2GB)

ファイル自体のサイズよりも content-length ヘッダーを信頼するブラウザのみが影響を受けているようです。

解決策は変更することです

header("Content-Length: " . filesize($file));

header("Content-Length: " . exec("stat -c %s ".escapeshellarg($filename)));
于 2013-06-07T21:49:45.390 に答える