概要:
PHP を使用してファイルをダウンロードする操作には 4 つの header() が必要です。私の他のブログ投稿「PHP によるダウンロード関数の超詳細なプロセス分析の方法」を参照してください。
サイズを計算するとき。 filesize($filename) から、最初にファイルを開く必要がある場合、filesize は filesize($filehandle)
データの送信元の形式になることがわかります。クライアントに戻す場合は、$buffer=1023 のように、毎回クライアントに出力するデータ量を指定するバッファを設定することを忘れないでください。指定しない場合は、ファイル全体をメモリに書き込み、クライアントにデータを一括送信します。
feof()関数により、読み込むファイルが読み込まれているかどうかを判定できます。まだ読み込まれていません。終了後、ファイルの読み取りを続行し ($file_data=fread())、データをクライアントに送り返します (echo $file_data)
各ダウンロードが完了すると、クライアントは更新されますこれは、実際には、毎回データを一時ファイルに書き込み、すべてのダウンロードが完了した後にすべてのデータを再統合することを示しています
ここでは絶対パスを使用します。絶対パスの利点は、より適応性が高いことです。相対パスに比べて効率的です(ファイルを見つけるプロセスが不要になります)
技術的なポイントを分析します:
ファイルを zip 形式にパッケージ化します
ダウンロード機能ファイル
キーポイント分析:
ここでは、PHP に付属の ZipArchive クラスを使用します
a) 新しい ZipArchive オブジェクトを作成し、open次に、addFile メソッドを使用して、作成した zip ファイルにパッケージ化するファイルを書き込みます。忘れずにオブジェクトを閉じてください。
b) 注: open メソッドを使用する場合、2 番目のパラメーター $flags は、開かれた zip ファイルの処理方法を指定するために使用されます。
i . ZIPARCHIVE::OVERWRITE は常に新しいファイルを作成します。指定された zip ファイルが存在する場合は上書きされます。
ii. ZIPARCHIVE::CREATE 指定された zip ファイルが存在しない場合は、新しいファイルが作成されます。
iii. ZIPARCHIVE::EXCL 指定された zip ファイルが存在する場合、エラーが報告されます
iv. ZIPARCHIVE::CHECKCONS
ファイルのダウンロード処理:
サーバー側の作業:
クライアントのブラウザは、ダウンロードされた PHP ファイルを処理するリクエストを送信します。
注: ビデオ、オーディオ、テキスト ファイルのいずれであっても、最初に操作をメモリに書き込む必要があります。
言い換えると、「サーバー」上のファイルを「サーバー」のメモリに読み取る操作が不可欠です (注: ここでは主にこれを説明するために、サーバーという単語を二重引用符で囲んでいます) 一連の操作は次のとおりです。サーバー上で完了します)。
ファイルをメモリに書き込む必要があるため、最初にファイルを開く必要があります
ここでは 3 つのファイル操作関数を示します:
1 つ: fopen($filename,$ mode)
2: fread ( int $handle , int $length )
3: fclose ( resource $handle )
クライアント側の作業:
それでは、次のようにします。サーバー側メモリにすでに存在するファイル情報フローをクライアントに渡しますか?
答えは header() 関数を通じてであり、クライアントはファイルの処理方法、保存するか開くかなどを知っています。
最終的な効果は以下のようになります:
コードをコピー コードは次のとおりです:
require'./download.php';
/**
* ディレクトリを走査し、zip 形式にパッケージ化します
*/
class traverseDir{
public $currentdir;// 現在のディレクトリ
public $filename;//ファイル名
public $fileinfo;//現在のディレクトリ内のすべてのファイル名、ディレクトリ名、およびファイル サイズを保存するために使用されます
public function __construct(){
$this - >currentdir=getcwd();//現在のディレクトリに戻ります
}
//ディレクトリを移動します
public function scandir($filepath){
if (is_dir($filepath)) {
$arr=scandir($filepath);
foreach ($arr as $k=>$v){
$this->fileinfo[$v][]=$this-> ;getfilesize($ v);
}
}else {
echo "<script>alert('現在のディレクトリは有効なディレクトリではありません');</script>"; }
}
/**
* ファイル サイズを返します
*
* @param string $filename ファイル名
* @return ファイル サイズ (KB)
*/
public function getfilesize($fname){
return filesize($fname)/1024;
}
/**
* 圧縮ファイル(zip形式)
*/
public function tozip($items){
$zip=new ZipArchive();
$zipname=date('YmdHis',time()); ($zipname)){
$zip->open($zipname.'.zip',ZipArchive::OVERWRITE);// ($i=0;$i< 用の空の zip ファイル
を作成します) count($items); $i ){
$zip->addFile($this->currentdir.'/'.$items[$i],$items[$i]);
$zip- >close();
$dw=new download($zipname.'.zip'); //ファイルをダウンロードします
$dw->getfiles(); ($zipname.'.zip') //ダウンロード後に削除します。
}
}
?> >コードをコピー
コードは次のとおりです:
/**
*/ class download{ protected $ _filename; protected $_filepath; protected $_filesize;// ファイル サイズ
public function __construct($filename){$this->_filename=$filename; >_filepath=dirname( __FILE__).'/'.$filename;
}
//ファイル名を取得します
public function getfilename(){
return $this->_filename; 🎜>}
//ファイルパスを取得します (ファイル名を含む)
public function getfilepath(){
return $this->
}
//ファイル サイズを取得します
public function getfilesize(){
return $this->_filesize=number_format(filesize($this->_filepath)/(1024*1024),2);//削除小数点第 2 位まで
}
//ファイルをダウンロードする関数
public function getfiles(){
//ファイルが存在するかどうかを確認します
if (file_exists($this->_filepath) ){
//ファイルを開きます
$file = fopen($this->_filepath,"r");
//返されたファイルの種類
Header("Content-type: application/ octet-stream");
/ /バイトサイズに応じて返す
Header("Accept-Ranges: bytes");
//ファイルのサイズを返す
Header("Accept -Length: ".filesize($this->_filepath) );
//これはクライアント用のポップアップ ダイアログ ボックスで、対応するファイル名です
Header("Content-Disposition:attachment; filename =".$this->_filename);
//変更前は一度にクライアントにデータを送信する
echo fread($file, filesize($this->_filepath));
//変更後は、一度に 1024 バイトのデータのみがクライアントに送信されます
//データをクライアントに送り返します
$buffer=1024;//
//ファイルがbe read
while (!feof($file)) {
//ファイルをメモリに読み取ります
$file_data=fread($file,$buffer);
//1024 バイトのデータを送信します毎回クライアントに戻ります
echo $file_data;
}
fclose($file)
}else {
echo "<script>alert('ダウンロードしたいファイルが存在しません');</script>";
}
}
}
?>
ページに表示されたコード:
コードをコピー
コードは次のとおりです:
header("Content-type:text/html;charset=utf8");
require('./getfile.php' );
$scandir=new traverseDir();
$scandir->scandir($scandir->currentdir);
if (isset ($_POST['down_load'])){
$items=$_POST['items'];
$scandir->tozip($items);// ファイルを zip 形式に圧縮します
echo "現在の作業ディレクトリ:".$scandir->currentdir;
echo "
現在のディレクトリ内のすべてのファイル"
<フォームアクション="list.php"メソッド="POST">
;/td> | サイズ (KB) | |
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
URL パラメータから取得した PHP 配列が期待どおりに動作しない
カテゴリ ID を含む URL パラメータがあり、それを次のような配列として扱いたいと考えています: http://example.com?cat[]=3,9,13 PHP では、...
から 2024-04-06 22:09:02
0
1
1428
戻り値の変数の形式は何ですか?
私はphpの初心者です。コードを見つけました: if($x<time()){return[false,'error'];} ロジックや変数は重要ではありませんが、[false...
から 2024-04-06 21:55:20
0
1
778
ループするために MySQL の結果を ID ごとにグループ化する
mysqlにフライトデータを含むテーブルがあります。 codeigniter3Journey_idair_idFlightDurationout_or_inflightdurati...
から 2024-04-06 17:27:56
0
1
406
関連トピック
詳細>
|