代码如下:
require_once "./include/zip.php"; $zip = new PHPZip(); // $zip -> createZip("要压缩的文件夹目录地址", "压缩后的文件名.zip"); //只生成不自动下载 $zip -> downloadZip("要压缩的文件夹目录地址", "压缩后的文件名.zip"); //自动下载
实例:可以参考下面的伪代码来看一个具体的使用场景:
代码如下:
require_once "./include/zip.php"; if (!$download) { exit(); } set_time_limit(60); $tmpManager = new TmpManager(); //假设我们有一个类来完成后面的操作 $tempfolder = array(); $tempfile = array(); //假设我们是通过在页面上选择checkbox来下载已选的文件夹或文件,并一同打包 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); $curtempdir = "$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); //将要下载的文件copy到创建的文件夹 } if (sizeof($tempfolder) > 0) { $tmpManager->CopyFolder($tempfolder,$curtempdir); //将要下载的文件夹copy到创建的文件夹 } $zip = new PHPZip(); $zip -> downloadZip($curtempdir, "file_".date('Ymd').".zip"); //打包并下载
zip.php
代码如下:
<?php /* File name: /include/zip.php Author: Horace 2009/04/15 */ class PHPZip{ var $dirInfo = array("0","0"); var $rootDir = ''; var $datasec = array(); var $ctrl_dir = array(); var $eof_ctrl_dir = "/x50/x4b/x05/x06/x00/x00/x00/x00"; 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, "$filename"); }else{ $this->dirTree($dir,$dir); } $zipfilenametemp = time().$zipfilename; $out = $this -> filezip(); $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 -> filezip(); }else{ echo "create zip error!"; } unlink($zipfilenametemp); } } //get dir tree.. 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"); //go on n's folders $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['minutes'] = 0; $timearray['seconds'] = 0; } // end if return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 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 = "/x50/x4b/x03/x04"; $fr .= "/x14/x00"; // ver needed to extract $fr .= "/x00/x00"; // gen purpose bit flag $fr .= "/x08/x00"; // compression method $fr .= $hexdtime; // last mod time and date // "local file header" segment $unc_len = strlen($data); $crc = crc32($data); $zdata = gzcompress($data); $c_len = strlen($zdata); $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug $fr .= pack('V', $crc); // crc32 $fr .= pack('V', $c_len); // compressed filesize $fr .= pack('V', $unc_len); // uncompressed filesize $fr .= pack('v', strlen($name)); // length of filename $fr .= pack('v', 0); // extra field length $fr .= $name; // "file data" segment $fr .= $zdata; // "data descriptor" segment (optional but necessary if archive is not // served as file) $fr .= pack('V', $crc); // crc32 $fr .= pack('V', $c_len); // compressed filesize $fr .= pack('V', $unc_len); // uncompressed filesize // add this entry to array $this -> datasec[] = $fr; $new_offset = strlen(implode('', $this->datasec)); // now add to central directory record $cdrec = "/x50/x4b/x01/x02"; $cdrec .= "/x00/x00"; // version made by $cdrec .= "/x14/x00"; // version needed to extract $cdrec .= "/x00/x00"; // gen purpose bit flag $cdrec .= "/x08/x00"; // compression method $cdrec .= $hexdtime; // last mod time & date $cdrec .= pack('V', $crc); // crc32 $cdrec .= pack('V', $c_len); // compressed filesize $cdrec .= pack('V', $unc_len); // uncompressed filesize $cdrec .= pack('v', strlen($name) ); // length of filename $cdrec .= pack('v', 0 ); // extra field length $cdrec .= pack('v', 0 ); // file comment length $cdrec .= pack('v', 0 ); // disk number start $cdrec .= pack('v', 0 ); // internal file attributes $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header $this -> old_offset = $new_offset; $cdrec .= $name; // optional extra field, file comment goes here // save to central directory $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)) . // total # of entries "on this disk" pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall pack('V', strlen($ctrldir)) . // size of central dir pack('V', strlen($data)) . // offset to start of central dir "/x00/x00"; // .zip file comment length } } ?>
相关文章:

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

섬유는 PHP8.1에 도입되어 동시 처리 기능을 향상시켰다. 1) 섬유는 코 루틴과 유사한 가벼운 동시성 모델입니다. 2) 개발자는 작업의 실행 흐름을 수동으로 제어 할 수 있으며 I/O 집약적 작업을 처리하는 데 적합합니다. 3) 섬유를 사용하면보다 효율적이고 반응이 좋은 코드를 작성할 수 있습니다.

PHP 커뮤니티는 개발자 성장을 돕기 위해 풍부한 자원과 지원을 제공합니다. 1) 자료에는 공식 문서, 튜토리얼, 블로그 및 Laravel 및 Symfony와 같은 오픈 소스 프로젝트가 포함됩니다. 2) 지원은 StackoverFlow, Reddit 및 Slack 채널을 통해 얻을 수 있습니다. 3) RFC에 따라 개발 동향을 배울 수 있습니다. 4) 적극적인 참여, 코드에 대한 기여 및 학습 공유를 통해 커뮤니티에 통합 될 수 있습니다.

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

WebStorm Mac 버전
유용한 JavaScript 개발 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.
