PHP code to compress a folder into a zip file_PHP tutorial
1. Please download the zip.php tool class I prepared first, unzip it after downloading, and put the files inside into the corresponding directory. I put it in the include folder under the virtual directory.
2. Add the following code to your php file
require_once " ./include/zip.php";
$zip = new PHPZip();
//$zip -> createZip("Directory address of the folder to be compressed", "Compressed file name.zip "); //Only generate and not automatically download
$zip -> downloadZip("Directory address of the folder to be compressed", "Compressed file name.zip"); //Automatically download
Example: You can refer to the following pseudo-code to see a specific usage scenario:
Code
require_once "./include/zip.php";
if (!$download) {
exit();
}
set_time_limit(60);
$ tmpManager = new TmpManager(); //Assume we have a class to complete the following operations
$tempfolder = array();
$tempfile = array();
//Assume we pass the page Select the checkbox to download the selected folder or file and package it together
for($i = 0;$i < $checkboxnum;$i++) {
$value = ${"select".$ i};
if ($value != '') {
$this_type = substr($value, 0, 1);
$this_id = substr($value, 1);
/ / Handle folders and files separately
if ($this_type == 'd') {
$tempfolder[] = $this_id;
}
elseif ($this_type == 'f ') {
$tempfile[] = $this_id;
}
}
}
@mkdir($tempdir);
$curtempdir = "$tempdir/".$userid ; //Different users operate in different temporary folders
if (file_exists($curtempdir)) {
$tmpManager->DeleteDir($curtempdir); //Delete old folders
}
if (sizeof($tempfolder) > 0 || sizeof($tempfile) > 0) {
mkdir($curtempdir, 0777); //If there are files or folders to be packaged, recreate them Folder
}
if (sizeof($tempfile) > 0) {
$tmpManager->CopyFile($tempfile,$curtempdir); //Copy the file to be downloaded to the created folder
}
if (sizeof($tempfolder) > 0) {
$tmpManager->CopyFolder($tempfolder,$curtempdir); //Copy the folder to be downloaded to the created folder
}
$zip = new PHPZip();
$zip -> downloadZip($curtempdir, "file_".date('Ymd').".zip"); //Package and download
zip.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 = "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, "$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 = "x50x4bx03x04";
$fr .= "x14x00"; // ver needed to extract
$fr .= "x00x00"; // gen purpose bit flag
$fr .= "x08x00"; // 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 = "x50x4bx01x02";
$cdrec .= "x00x00"; // version made by
$cdrec .= "x14x00"; // version needed to extract
$cdrec .= "x00x00"; // gen purpose bit flag
$cdrec .= "x08x00"; // 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
"x00x00"; // .zip file comment length
}
}
?>
zip.php文件打包

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

This article recommends ten well-known virtual currency-related APP recommendation websites, including Binance Academy, OKX Learn, CoinGecko, CryptoSlate, CoinDesk, Investopedia, CoinMarketCap, Huobi University, Coinbase Learn and CryptoCompare. These websites not only provide information such as virtual currency market data, price trend analysis, etc., but also provide rich learning resources, including basic blockchain knowledge, trading strategies, and tutorials and reviews of various trading platform APPs, helping users better understand and make use of them

thinkphp6...

Sending JSON data using PHP's cURL library In PHP development, it is often necessary to interact with external APIs. One of the common ways is to use cURL library to send POST�...

This article provides detailed exchange recommendations and introductory tutorials for beginners in the currency circle. Commonly used exchanges such as Coinbase, Binance, Kraken, Ouyi and Sesame Open Door are recommended, and the steps for registration, identity verification, security settings, recharge and trading are introduced. The article also emphasizes the importance of security awareness, risk control and continuous learning, aiming to help beginners enter the digital asset field safely and rationally.

Many website developers face the problem of integrating Node.js or Python services under the LAMP architecture: the existing LAMP (Linux Apache MySQL PHP) architecture website needs...

PHP performance tuning: Efficiently troubleshoot memory overflow and time-consuming problems. When importing Excel files to parse data in production environments, you often encounter memory overflow errors, even if...

This article recommends several commonly used and relatively safe virtual currency exchanges for beginners entering the currency circle in 2025, including Binance, Ouyi, Coinbase and Sesame Open Door. The article provides detailed tutorials on registration, authentication, security setup and transaction process, and emphasizes the importance of risk control, security awareness and ongoing learning, aiming to help beginners securely get started with digital asset trading.

There are six free market viewing software websites: 1. Binance platform, suitable for digital asset investors; 2. OKX platform, providing rich market data; 3. Sesame Open Door (Gate.io) platform, suitable for users who trade in Gate.io; 4. TradingView, providing professional charting tools; 5. CoinMarketCap, covering a wide range of digital asset data; 6. CoinGecko, providing project fundamental evaluation. When choosing a platform, you need to consider investment objects, chart function requirements, data comprehensiveness and user experience.
