検索
ホームページphp教程php手册PHP ファイルのパッケージ化。PHP 独自の ZipArchive をダウンロードして使用して、ファイルを圧縮し、パッケージ化されたファイルをダウンロードします。

概要:

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を作成します) 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 "
現在のディレクトリ内のすべてのファイル"




$res=$scandir-> >foreach ($res as $k=>$v){
if (!($k=='.' || $k=='..')) {// と を除外します。
?>




}
}
?> tr>
td>




;/td>
サイズ (KB)
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール