ホームページ  >  記事  >  バックエンド開発  >  フォルダーを zip ファイルに圧縮する PHP コード_PHP チュートリアル

フォルダーを zip ファイルに圧縮する PHP コード_PHP チュートリアル

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

1. 最初に用意したzip.phpツールクラスをダウンロードし、ダウンロード後解凍し、中のファイルを仮想ディレクトリ下のincludeフォルダに置きます。
2. 次のコードを php ファイルに追加します

コードをコピーします:
require_once "./include/zip.php"
$zip = new PHPZip(); / /$zip -> createZip("圧縮対象フォルダのディレクトリアドレス", "圧縮ファイル名.zip") //生成のみで自動ダウンロードはされません
$zip -> " ディレクトリアドレス", "圧縮ファイル名.zip"); // 自動ダウンロード


例: 特定の使用シナリオを確認するには、以下の疑似コードを参照できます:
コード



コードをコピーします
コードは次のとおりです: require_once "./include/zip.php";
if (!$download) {
}
set_time_limit(60); / 後続の操作を完了するためのクラスがあると仮定します
$tempfolder = array();
$tempfile = array();
//ページ上のチェックボックスを選択して、選択したフォルダーまたはファイルをダウンロードし、一緒にパッケージ化するとします
for ($i = 0;$i < $checkboxnum;$i++) {
$value = ${"select".$i};
if ($value != '') {
$this_type = substr($ value , 0, 1);
$this_id = substr($value, 1);
//フォルダーとファイルを個別に処理します
if ($this_type == 'd') {
$tempfolder[] = $this_id ;
elseif ($this_type == 'f') {
$tempfile[] = $this_id;
}
}
@mkdir($tempdir) = "$tempdir/".$userid ;異なるユーザーが異なる一時フォルダーで操作します
if (file_exists($curtempdir)) {
$tmpManager->DeleteDir($curtempdir) //古いフォルダーを削除します
}
if (sizeof($ tempfolder) > 0 || sizeof ($tempfile) > 0) {
mkdir($curtempdir, 0777); //パッケージ化するファイルやフォルダーがある場合は、フォルダーを再作成します
}
if (sizeof($ tempfile) > 0) {
$ tmpManager->CopyFile($tempfile,$curtempdir); //作成したフォルダーにダウンロードするファイルをコピーします
}
if (sizeof($tempfolder) > 0) {
$tmpManager->CopyFolder($tempfolder) ,$curtempdir); //作成したフォルダーにダウンロードするフォルダーをコピーします
$zip = new PHPZip()
$zip -> downloadZip($curtempdir, " file_".date('Ymd'). ".zip"); //パッケージ化してダウンロードします


zip.php



コードをコピーします

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

/*
ファイル名: /include/zip.php
作成者: Horace 2009/04/15
*/
class PHPZip{
var $dirInfo = array("0","0") ;
var $rootDir = '';
var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
var $old_offset = 0;

function downloadZip(){
createZip($dir, $zipfilename, true);
}
function createZip($dir, $zipfilename, $autoDownload = false){
if (@function_exists('gzcompress')){
@set_time_limit("0");
if (is_array($dir)){
$fd = fopen ($dir, "r");
$fileValue = fread ($fd, ファイルサイズ ($filename));
fclose ($fd);
if (is_array($dir)) $filename = Basename($dir);
$this -> addFile($fileValue, "$ファイル名");
}else{
$this->dirTree($dir,$dir);
}

$zipfilenametemp = time().$zipfilename;
$out = $this ->ファイルzip();
$fp = fopen($zipfilenametemp, "w");
fwrite($fp, $out, strlen($out));
fclose($fp);
$filesize = filesize($zipfilenametemp);

if ($filesize < 104857600) {
if($autoDownload){
header("Content-type: application/octet-stream");
header("Content-disposition:attachment; filename=".$zipfilename);
}
echo $this ->ファイルzip();
}else{
echo "zip エラーの作成!";
}
unlink($zipfilenametemp);
}
}
//ディレクトリツリーを取得..
function dirTree($directory,$rootDir){
global $_SERVER,$dirInfo,$rootDir;

$fileDir=$rootDir;
$myDir=dir($directory);
while($file=$myDir->read()){
if(is_dir("$directory/$file") and $file!="." and $file!=".."){
$ dirInfo[0]++;
$rootDir ="$fileDir$file/";

$this -> addFile('', "$rootDir");

//n のフォルダーに移動します
$this->dirTree("$directory/$file",$rootDir);
}else{
if($file!="." and $file!=".."){
$dirInfo[1]++;
//$fd = fopen ("$directory/$file", "r");
$fileValue = file_get_contents("$directory/$file");
//fclose ($fd);
$this -> addFile($fileValue, "$fileDir$file");
}
}
}
$myDir->close();
}
function unix2DosTime($unixtime = 0) {
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

if ($timearray['year'] < 1980) {
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['分'] = 0;
$timearray['秒'] = 0;
} // 終了 if

return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
($timearray['時間'] << 11) | ($timearray['分'] << 5) | ($timearray['秒'] >> 1);
}
function addFile($data, $name, $time = 0){
$name = str_replace('\', '/', $name);

$dtime = dechex($this->unix2DosTime($time));
$hexdtime = 'x' 。 $dtime[6] 。 $dtime[7]
。 'バツ' 。 $dtime[4] 。 $dtime[5]
。 'バツ' 。 $dtime[2] 。 $dtime[3]
。 'バツ' 。 $dtime[0] 。 $dtime[1];
eval('$hexdtime = "' . $hexdtime . '";');

$fr = "x50x4bx03x04";
$fr .= "x14x00"; //
$fr を抽出するために必要なバージョン .= "x00x00"; // 生成目的ビットフラグ
$fr .= "x08x00"; // 圧縮方式
$fr .= $hexdtime; // 最終更新日時

// 「ローカル ファイル ヘッダー」セグメント
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$c_len = strlen($zdata);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // crc バグを修正
$fr .= Pack('V', $crc); // crc32
$fr .= Pack('V', $c_len); // 圧縮ファイルサイズ
$fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
$fr .= Pack('v', strlen($name)); // ファイル名の長さ
$fr .= Pack('v', 0); // 追加のフィールド長
$fr .= $name;

// 「ファイルデータ」セグメント
$fr .= $zdata;

// 「データ記述子」セグメント (オプションですが、アーカイブがファイルとして提供されない場合は必須です
//)
$fr .= Pack('V', $crc); // crc32
$fr .= Pack('V', $c_len); // 圧縮ファイルサイズ
$fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ

// このエントリを配列
$this -> に追加します。データセック[] = $fr;
$new_offset = strlen(implode('', $this->datasec));

// 中央ディレクトリレコードに追加します
$cdrec = "x50x4bx01x02";
$cdrec .= "x00x00"; //
$cdrec によって作成されたバージョン .= "x14x00"; // 抽出に必要なバージョン
$cdrec .= "x00x00"; // 生成目的ビットフラグ
$cdrec .= "x08x00"; // 圧縮方式
$cdrec .= $hexdtime; // 最終更新日時
$cdrec .= Pack('V', $crc); // crc32
$cdrec .= Pack('V', $c_len); // 圧縮ファイルサイズ
$cdrec .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
$cdrec .= Pack('v', strlen($name) ); // ファイル名の長さ
$cdrec .= Pack('v', 0 ); // 追加のフィールド長
$cdrec .= Pack('v', 0 ); // ファイルコメントの長さ
$cdrec .= Pack('v', 0 ); // ディスク番号の開始
$cdrec .= Pack('v', 0 ); // 内部ファイル属性
$cdrec .= Pack('V', 32 ); // 外部ファイル属性 - 'archive' ビットセット

$cdrec .= Pack('V', $this -> old_offset ); // ローカルヘッダーの相対オフセット
$this -> old_offset = $new_offset;

$cdrec .= $name;

// オプションの追加フィールド、ファイルのコメントがここに入ります
// 中央ディレクトリに保存します
$this -> ctrl_dir[] = $cdrec;
}
function filezip(){
$data = implode('', $this -> datasec);
$ctrldir = implode('', $this -> ctrl_dir);

return
$data 。
$ctrldir 。
$これ -> eof_ctrl_dir 。
pack('v', sizeof($this -> ctrl_dir)) 。 // 「このディスク上」のエントリの合計数
pack('v', sizeof($this -> ctrl_dir)) 。 // 全体のエントリの合計数
pack('V', strlen($ctrldir)) 。 // 中央ディレクトリのサイズ
pack('V', strlen($data)) 。 // 中央ディレクトリの先頭へのオフセット
"x00x00"; // .zip ファイルのコメントの長さ
}
}
?>

zip.php文件打包

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/320928.html技術記事 1. 先にダウンロードしてください、私は準備ができています zip.php ツールの種類、ダウンロード後に解凍して、このページのファイルを対応するリストに配置します。 ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。