-
- /**
- * 一般ファイルの安全なダウンロード
- * bbs.it-home.org を編集
- */
- $durl = 'file/phpcms2008_o2abf32efj883c91a.iso';
- $filename = 'phpcms2008_o2abf32efj883c91a.iso'; = @fopen ($durl, 'r');
- header("Content-Type: application/octet-stream");
- header("Accept-Length: ".filesize($durl) );
- header("Content-Disposition:attachment; filename=".$filename);
- fclose($file);
-
-
- ;
-
-
上記のコードが php.ini で設定された最大メモリ値を超える大きなファイルに遭遇すると、サーバーは多くの CPU リソースを占有し、ファイルは正常にダウンロードできなくなります。ダウンロードできるのは数十 KB のファイルのみです。
これは次のコードで解決できます。
/*** 大きなファイルを安全にダウンロードするための実装コード * bbs.it-home.org を編集- */
- function download($url, $filename) {
- // ファイルサイズを取得し、ファイルが 2G を超えるのを防ぎ、sprintf を使用して
- $filesize を読み取ります= sprintf ( "%u", filesize ( $url ) );
- if (! $filesize) {
- }
- header ( "Content-type:application/octet-streamn" );ストリーム
- ヘッダー ( "Content-type:unknown/unknown;" );
- header ( "Content-disposition:attachment; filename="" . $filename . """ ); ' );
- if ($range = getenv ( 'HTTP_RANGE' )) { // オフセットがある場合は、206 のブレークポイント再開ヘッダーを使用します
- $range =explode ( '=', $range ); $range [1];
-
- header ( "HTTP/1.1 206 Partial Content" );
- header ( "Date: " . gmdate ( "D, d M Y H:i:s" ) . " GMT" ); "Last-Modified: " . gmdate ( "D, d M Y H:i:s", filemtime ( $url ) ) . " GMT" );長さ:" . ($filesize - $range) );
- header ( "Content-Range: bytes " . $range . ($filesize - 1) . "/" . $filesize );
- header ( "Connection : close" . "nn" );
- } else {
- ヘッダー ( "Content-Length:" . $filesize . "nn" );
- loadFile ( $url ); $filename, $retbytes = true) {
- $buffer = '';
- $handle = fopen ( $filename, 'rb' );
- if ($handle === false) ;
- }
- while ( ! feof ( $handle ) ) {
- $buffer = fread ( $handle , 1024 );
- if ($ retbytes);
- $cnt += strlen ( $buffer );
- }
- }
- $status = fclose ( $handle );
- return $cnt; // num を返します。 ) です。
- }
- return $status;
-
-
- コードをコピーします
-
-
- 呼び出し例:
-
-
-
-
-
- //大きなファイルの安全なダウンロード
- download($url, $filename);
-
-
- コードをコピー
-
-
-
-
-
-
-
-
|