ホームページ > php教程 > php手册 > フォルダーを zip ファイルに圧縮するための PHP コード

フォルダーを zip ファイルに圧縮するための PHP コード

WBOY
リリース: 2016-06-13 12:20:21
オリジナル
1509 人が閲覧しました

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

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


require_once " ./include/zip.php";
$zip = new PHPZip();
//$zip -> "圧縮対象フォルダのディレクトリアドレス", "圧縮ファイル名.zip "); //生成のみで自動ダウンロードはしない
$zip -> downloadZip("圧縮対象フォルダのディレクトリアドレス", "圧縮ファイル名.zip"); //自動ダウンロード


例: 次の疑似コードを参照して、特定の使用シナリオを確認できます:
コード

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


require_once "./include/zip.php";
if (!$download) {
exit();
set_time_limit(60) ;
$ tmpManager = new TmpManager() //後続の操作を完了するためのクラスがあると仮定します
$tempfile = array();ページを渡します チェックボックスを選択して、選択したフォルダーまたはファイルをダウンロードし、まとめてパッケージ化します
for($i = 0;$i < $checkboxnum;$i ) {
$value = ${"select" .$ i};
if ($value != '') {
$this_type = substr($value, 0, 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, filesize ($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;
} // end 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]
。 'x' 。 $dtime[4] 。 $dtime[5]
。 'x' 。 $dtime[2] 。 $dtime[3]
。 'x' 。 $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 。
$this -> 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文件打包
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート