ホームページ  >  記事  >  バックエンド開発  >  大きなファイルを安全にダウンロードするための PHP 実装コード

大きなファイルを安全にダウンロードするための PHP 実装コード

WBOY
WBOYオリジナル
2016-07-25 08:58:51778ブラウズ
  1. /**
  2. * 一般ファイルの安全なダウンロード
  3. * bbs.it-home.org を編集
  4. */
  5. $durl = 'file/phpcms2008_o2abf32efj883c91a.iso';
  6. $filename = 'phpcms2008_o2abf32efj883c91a.iso'; = @fopen ($durl, 'r');
  7. header("Content-Type: application/octet-stream");
  8. header("Accept-Length: ".filesize($durl) );
  9. header("Content-Disposition:attachment; filename=".$filename);
  10. fclose($file);
  11. ;
上記のコードが php.ini で設定された最大メモリ値を超える大きなファイルに遭遇すると、サーバーは多くの CPU リソースを占有し、ファイルは正常にダウンロードできなくなります。ダウンロードできるのは数十 KB のファイルのみです。 これは次のコードで解決できます。

/**
* 大きなファイルを安全にダウンロードするための実装コード
    * bbs.it-home.org を編集
  1. */
  2. function download($url, $filename) {
  3. // ファイルサイズを取得し、ファイルが 2G を超えるのを防ぎ、sprintf を使用して
  4. $filesize を読み取ります= sprintf ( "%u", filesize ( $url ) );
  5. if (! $filesize) {
  6. }
  7. header ( "Content-type:application/octet-streamn" );ストリーム
  8. ヘッダー ( "Content-type:unknown/unknown;" );
  9. header ( "Content-disposition:attachment; filename="" . $filename . """ ); ' );
  10. if ($range = getenv ( 'HTTP_RANGE' )) { // オフセットがある場合は、206 のブレークポイント再開ヘッダーを使用します
  11. $range =explode ( '=', $range ); $range [1];
  12. header ( "HTTP/1.1 206 Partial Content" );
  13. 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) );
  14. header ( "Content-Range: bytes " . $range . ($filesize - 1) . "/" . $filesize );
  15. header ( "Connection : close" . "nn" );
  16. } else {
  17. ヘッダー ( "Content-Length:" . $filesize . "nn" );
  18. loadFile ( $url ); $filename, $retbytes = true) {
  19. $buffer = '';
  20. $handle = fopen ( $filename, 'rb' );
  21. if ($handle === false) ;
  22. }
  23. while ( ! feof ( $handle ) ) {
  24. $buffer = fread ( $handle , 1024 );
  25. if ($ retbytes);
  26. $cnt += strlen ( $buffer );
  27. }
  28. }
  29. $status = fclose ( $handle );
  30. return $cnt; // num を返します。 ) です。
  31. }
  32. return $status;
  33. コードをコピーします
  34. 呼び出し例:
  35. //大きなファイルの安全なダウンロード
  36. download($url, $filename);
  37. コードをコピー
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。