ホームページ >バックエンド開発 >PHPチュートリアル >PHP ファイルのパッケージ化 PHP 独自の ZipArchive をダウンロードして使用し、ファイルを圧縮し、パッケージ化されたファイルをダウンロードする_PHP チュートリアル

PHP ファイルのパッケージ化 PHP 独自の ZipArchive をダウンロードして使用し、ファイルを圧縮し、パッケージ化されたファイルをダウンロードする_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:18:08899ブラウズ

概要:

PHP を使用してファイルをダウンロードする操作には 4 つの header() が必要です。私の他のブログ投稿「PHP によるダウンロード関数の実装方法」を参照してください。ファイルのサイズを計算するときは、次のようにします。最初にファイルを開く必要はありません。filesize($filename) で確認できます。最初にファイルを開く必要がある場合、filesize は filesize($filehandle) の形式になる可能性があります
データをクライアントに送り返すには、次のことを覚えておいてください。バッファを設定するには、「$buffer=1023」のように、毎回クライアントに出力するデータ量を指定します。指定しない場合、ファイル全体がメモリに書き込まれ、読み取られるファイルが読み込まれているかどうかを feof() 関数によって一度にクライアントに送信します。読み取られていない場合は、ファイルの読み取りを続行し ($file_data=fread())、データをクライアントに送り返します (echo $file_data)
各ダウンロードが完了すると、クライアントが更新され、実際にはデータは毎回一時ファイルに書き込まれ、すべてのダウンロードが完了したら、すべてのデータを再統合します
ここでは絶対パスを使用します。絶対パスには、相対パスよりも適応性が高く、効率的であるという利点があります (プロセスが不要になります)。
技術的なポイントの分析:​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​,新しい ZipArchive オブジェクトを作成し、次に open メソッドを使用して zip ファイルを作成し、次に addFile メソッドを使用して、作成したばかりの zip ファイルにパッケージ化するファイルを書き込みます。忘れずにオブジェクトを閉じることをお勧めします。

b) 注: open メソッドを使用する場合、2 番目のパラメーター $flags は、開かれた zip ファイルの処理方法を指定するために使用されます。

i. ZIPARCHIVE::OVERWRITE を常に作成します。指定した zip ファイルが存在する場合は上書きされます

ii. ZIPARCHIVE::CREATE 指定された zip ファイルが存在しない場合は、新しいファイルを作成しますiii. 指定された zip ファイルが存在する場合ファイルが存在する場合、エラーが報告されます。

iv. ZIPARCHIVE::CHECKCONS

ファイルのダウンロードのプロセス:イアロイ
注: ビデオ、オーディオ、テキスト ファイルのいずれであっても、操作は最初にメモリに書き込まれる必要があります。
言い換えれば、「サーバー」上のファイルを「サーバー」のメモリに読み取る操作が不可欠です (注: ここでは、主にこのシステムを説明するために、サーバーという単語を二重引用符で囲んでいます。クラスの操作は上で完了します)サーバー)。

ファイルをメモリに書き込みたいので、最初にファイルを開く必要があります
ここでは 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形式)
*/
パブリック関数 tozip($items){
$zip=new ZipArchive();
$zipname=date('YmdHis',time());
if (!file_exists($zipname)){
$zip-> open($zipname.'.zip',ZipArchive::OVERWRITE);//空の zip ファイルを作成します
for ($i=0;$i$zip-> addFile($this-> ;currentdir.'/'.$items[$i],$items[$i]);
}
$zip->close();
$dw=new download($zipname. '.zip'); //ファイルをダウンロードします
$dw->getfiles(); //ダウンロードが完了したら削除します
}
}
;



コードをコピーします
コードは次のとおりです: /**
* ファイルをダウンロード
*
*/
class download{
protected $_filename;
protected $_filesize; ;//ファイルサイズ
public function __construct ($filename){
$this->_filename=$filename;
$this->_filepath=dirname(__FILE__).'/'.$filename;
//ファイル名を取得します
public function getfilename() {
return $this->_filename
}

//ファイルパスを取得します(ファイル名を含む)
public function getfilepath(){
return $this->_filepath; ;
}

//ファイルサイズを取得します
public function getfilesize(){
return $this->filesize=number_format(filesize($this->filepath)/(1024*1024),2);//小数点以下第 2 位まで削除
}
//ファイルをダウンロード Function
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;//
//ファイルは完全に読み取られました
while (!feof($file)) {
//ファイルをメモリに読み取ります
$file_data=fread($file,$buffer);
//1024 バイトのデータをクライアントに送信します毎回
echo $file_data;

fclose($file);
echo "<script>alert('ダウンロードしたいファイルは存在しません');</script> ";
}
}
}
?>


ページに表示されるコード:



コードをコピー
コードは次のとおりです:



header("Content-type:text/html;charset=utf8");
$scandir=new traverseDir(); $scandir->scandir($scandir->現在のディレクトリ);

if (isset($_POST['down_load'])){
$items=$_POST['items'] ;
$scandir->tozip($items);//ファイルをzip形式に圧縮します
}
echo "現在の作業ディレクトリ:".$scandir->currentdir;
echo "
すべてのファイル";
?>





< ; td>名前

$res=$scandir->fileinfo; k=>$v){
if (!($k=='.' || $k=='..')) {// と ..
?>
<
td>
}
?>








http://www.bkjia.com/PHPjc/325567.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/325567.html
技術記事

概要: PHP を使用してファイルをダウンロードするには、4 つの header() を指定する必要があります。私の他のブログ投稿「PHP がファイルのサイズを計算するための詳細なプロセスを分析するとき」を参照してください。 .

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