- ?//在URL後参加?pwd=密码查看生成密码
- $password = '8baa717e6265d1c1d762cc896151f821'; //l23
- ?>
-
- php ZIP压缩程序
-
-
-
在線上压缩ZIP文件程序
-
-
-
使用方法: 圧縮するファイルまたは項目 (子項目を含む) を選択すると、圧縮の結果、元の項目構造が維持されます。
- echo '当前目录:'. dirname(__FILE__) . ' 退出';
- else
- if(isset($_GET['pwd']) )
- echo '密码值:'. md5($_GET['pwd']) . '';
- else
- echo 'Tips:在URL后参加?pwd=密码 查看生成密码.';
- ?>
-
- if(!isset($_REQUEST["myaction"])):
- ?>
-
- document.getElementById('password').focus();
-
- elseif($_REQUEST["myaction"]=="dolist") :
- if(!isset($_REQUEST['pwd']) || empty($_REQUEST['pwd']) )
- die('请输入密码! また');
- if(md5($_REQUEST['pwd']) != $password)
- die('输入的密码不正确!Again');
- echo '除外するディレクトリを選択します (カンマで区切られた相対パス):
';
- echo '
';
- echo "圧縮するファイルを選択してくださいまたはディレクトリ:
";
- $fdir = opendir('./');
- while($file=readdir($fdir)){
- if($file=='.'|| $file =='..' ) 続行;
- echo " ";
- if(is_file($file)){
- echo "ファイル: $file
";
- }else{
- echo "ディレクトリ: $file
";
- }
- }
- ?>
- 圧縮ファイルをディレクトリに保存します:
- (このディレクトリは空白のままにしてください。書き込みが必要です)許可)
- 圧縮ファイル名:
- (.zip)
- elseif($_REQUEST["myaction"]==" dozip" ):
- // set_time_limit(0);
- class PHPzip{
- var $file_count = 0;
- var $datastr_len = 0;
- var $dirstr_len = 0;
- var $filedata = ''; //この変数はクラス外のプログラムによってのみアクセスされます
- var $gzfilename;
- var $fp;
- var $dirstr='';
- /*
- ファイルの変更時の形式を返します。
- このクラスの内部関数に対してのみ呼び出されます。
- */
- 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;
- }
- return (($timearray['年'] - 1980) << 25) ($timearray['mon'] <) ;< 21) | ($timearray['mday'] <16) |
- ($timearray['hours'] <11) | ) | ($timearray[ '秒'] >> 1);
- }
-
- /*
- ファイルを初期化し、ファイル ディレクトリを作成し、
- ファイルの書き込み権限を返します。
- */
- function startfile( $path = 'myzip.zip') {
- $this->gzfilename=$path;
- $mypathdir=array();
- do{
- $mypathdir[] = $path = dirname($path);
- }while ($path != '.') ;
- @end($mypathdir);
- do{
- $path = @current($mypathdir);
- @mkdir($path);
- }while(@prev($mypathdir) );
-
- if($this->fp=@fopen($this->gzfilename,"w")){
- return true;
- }
- return false;
- }
-
- /*
- zip アーカイブにファイルを追加します。
- */
- function addfile($data, $name){
- $name = str_replace('\', '/', $name);
-
- if( strrchr ($name,'/')=='/') return $this->adddir($name);
-
- $dtime = dechex($this->unix2DosTime());
- $hexdtime = 'x ' . $dtime[6] . $dtime[4] . 'x ' . $dtime[0] . $dtime[1];
- eval('$hexdtime = "' . $hexdtime . '";');
-
- $unc_len = strlen($data);
- $crc = crc32 ( $data);
- $zdata = gzcompress($data);
- $c_len = strlen($zdata);
- $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
- //新しいファイルコンテンツのフォーマット:
- $datastr = "x50x4bx03x04";
- $datastr .= "x14x00"; // 抽出するために必要なバージョン $datastr .= "x00x00"; // 生成目的ビットフラグ
- $datastr . = "x08x00"; // 圧縮方法
- $datastr .= $hexdtime; // 最終更新日時
- $datastr .= Pack('V', $crc) // crc32
- $datastr .= Pack(' V', $c_len); // 圧縮ファイルサイズ
- $datastr .= Pack('V', $unc_len) // 非圧縮ファイルサイズ
- $datastr .= Pack('v', strlen($name));ファイル名の長さ
- $datastr .= Pack('v', 0); // 追加フィールド長
- $datastr .= $name;
- $datastr .= $zdata;
- $datastr .= Pack('V ', $ crc); // crc32
- $datastr .= Pack('V', $c_len); // 圧縮ファイルサイズ
- $datastr .= Pack('V', $unc_len) // 非圧縮ファイルサイズ
-
-
- ; this->fp,$datastr); //新しいファイルの内容を書き込みます
- $my_datastr_len = strlen($datastr);
- unset($datastr);
-
- //新しいファイルのディレクトリ情報を追加します
- $dirstr = "x50x4bx01x02";
- $dirstr .= "x00x00"; // 作成したバージョン
- $dirstr .= "x14x00"; // 抽出するために必要なバージョン $dirstr .= "x00x00"; // 生成目的のビットフラグ
- $dirstr .= " x08x00"; // 圧縮方式
- $dirstr .= $hexdtime; // 最終更新日時
- $dirstr .= Pack('V', $crc); // crc32
- $dirstr .= Pack('V' , $c_len); // 圧縮されたファイルサイズ
- $dirstr .= Pack('V', $unc_len) // 非圧縮ファイルサイズ
- $dirstr .= Pack('v', strlen($name) );ファイル名
- $dirstr .= Pack('v', 0 ); // 追加のフィールド長
- $dirstr .= Pack('v', 0 ); // ファイルコメントの長さ
- $dirstr .= Pack ('v', 0 ); // ディスク番号 start
- $dirstr .= Pack('v', 0 ); // 内部ファイル属性
- $dirstr .= Pack('V', 32 ); // 外部ファイル属性 - 'archive' bit set
- $dirstr .= Pack('V',$this->datastr_len ); // ローカルヘッダーの相対オフセット
- $name;
-
- $this->dirstr . / /ディレクトリ情報
-
- $this -> file_count ++;
- $this -> dirstr_len += strlen($dirstr);
- $this -> datastr_len += $my_datastr_len;
- }
-
- function adddir($name) ){
- $name = str_replace("\", "/", $name);
- $datastr = "x50x4bx03x04x0ax00x00x00x00x00x00x00x00x00";
-
- $datastr .= Pack("V",0).pack( "V",0 ).pack("V",0).pack("v", strlen($name) );
- $datastr .= Pack("v", 0 ).$name.pack("V ", 0). Pack("V", 0).pack("V", 0);
-
- fwrite($this->fp,$datastr); // 新しいファイルの内容を書き込みます
- $my_datastr_len = strlen($datastr);
- unset($datastr);
-
- $dirstr = "x50x4bx01x02x00x00x0ax00x00x00x00x00x00x00x00x00";
- $dirstr .= Pack("V",0).pack("V",0).pack("V" ,0).pack(" v", strlen($name) );
- $dirstr .= Pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack ("v", 0 ) ;
- $dirstr .= Pack("V", 16 ).pack("V",$this->datastr_len).$name;
-
- $this->dirstr .= $ dirstr; //ディレクトリ情報
-
- $this -> file_count ++;
- $this -> dirstr_len += strlen($dirstr);
- $this -> datastr_len += $my_datastr_len;
- }
-
-
- function createfile(){
- //ファイルの総数、ディレクトリ情報読み取りポインター位置およびその他の情報を含む、圧縮されたパッケージの終了情報
- $endstr = "x50x4bx05x06x00x00x00x00" .
- Pack('v', $this -> file_count) .
- Pack('v', $this -> file_count) .
- Pack('V', $this -> dirstr_len) .
- Pack('V', $this -> datastr_len) .
- " x00x00" ;
-
- fwrite($this->fp,$this->dirstr.$endstr);
- fclose($this->fp);
- }
- }
-
-
- if(!trim($_REQUEST) [' zipname']))
- $_REQUEST['zipname'] = 'backup_'.substr(md5(__FILE__),0,8). '.zip';
- else
- $_REQUEST['zipname'] = trim( $_REQUEST ['zipname']);
- if(!strrchr(strto lower($_REQUEST['zipname']),'.')=='.zip')
- $_REQUEST['zipname'] .= ".zip ";
- $_REQUEST['todir'] = str_replace('\','/',trim($_REQUEST['todir']));
- if(!strrchr(strto lower($_REQUEST['todir']), '/ ')=='/')
- $_REQUEST['todir'] .= "/";
- if($_REQUEST['todir']=="/")
- $_REQUEST['todir'] = " ./ ";
-
- function listfiles($dir="."){
- global $faisunZIP;
- $sub_file_num = 0;
-
- if(is_file($dir)){
- if(realpath($faisunZIP->gzfilename) )! =realpath($dir)){
- $faisunZIP -> addfile(implode('',file($dir)),$dir);
- return 1;
- }
- return 0;
- }
-
- $handle =opendir ($dir);
- //除外を追加します
- $to_exlude = !empty($_POST['toexlude']) ? $_POST['toexlude'] :'';
- $exlude = empty($to_exlude) ? () :explode(',',$to_exlude);
- while ($file = readdir($handle)) {
- if($file=="."||$file==".." || $file == 'wp-content' )Continue;
- if(is_dir("$dir/$file") && !in_array("$dir/$file",$exlude) )
- {
- $sub_file_num += listfiles("$ dir/ $file");
- }
- else {
- if(realpath($faisunZIP ->gzfilename)!=realpath("$dir/$file")){
- $faisunZIP -> addfile(implode('') ,file ("$dir/$file")),"$dir/$file");
- $sub_file_num ++;
- }
- }
- }
- Closedir($handle);
- if(!$sub_file_num) $faisunZIP -> ; addfile("","$dir/");
- return $sub_file_num;
- }
-
- function num_bitunit($num){
- $bitunit=array(' B',' KB',' MB',' GB' );
- for($key=0;$key if($num>=pow(2,10*$key)-1){ //1023B になります1KB として表示されます
- $num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100)." $bitunit[$key]";
- }
- }
- return $num_bitunit_str;
- }
-
- if( is_array($_REQUEST['dfile'])){
- $faisunZIP = new PHPzip;
- if($faisunZIP -> startfile($_REQUEST['todir'].$_REQUEST['zipname'])){
- echo " 圧縮ファイルを追加しています...
";
- $filenum = 0;
- foreach($_REQUEST['dfile'] as $file){
- if(is_file($file)){
- echo "ファイル: $file
";
- }else{
- echo "ディレクトリ: $file
";
- }
- $ filenum += listfiles($file);
- }
- $faisunZIP -> createfile();
- echo "
圧縮が完了しました。合計 $filenum ファイルが追加されました。 ". $_REQUEST['todir'].$_REQUEST['zipname'] (".num_bitunit(filesize( "$ _REQUEST[todir]$_REQUEST[zipname]")).")";
- }else{
- echo $_REQUEST['todir'].$_REQUEST['zipname'].'書き込めません、パスまたは権限が正しいかどうかを確認してください。
';
- }
- }else{
- echo "ファイルまたはディレクトリが選択されていません。
";
- }
-
-
- endif;
-
- ?>
- < /form>
-
コードをコピーします
|