webForumDet fria alternativet

Zippa flera filer samtidigt

PHP

1 svar · 331 visningar · startad av vic

Medlem sedan apr. 2006244 inlägg
Frågan#1

Har ett script för att zippa flera filer samtidigt, det går dock inte att zippa fler än en fil åt gången, hur kan det komma sig=?

<?php 

// Class definition found at http://www.zend.com/zend/spotlight/creating-zip-files3.php
// Some alterations to the original posted code were made in order to get everything working properly
// See example usage at the bottom of this page

class zipfile 
{ 
	var $datasec = array(); 
	var $ctrl_dir = array(); 
	var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; 
	var $old_offset = 0; 
	
	function add_dir($name) { 
		$name = str_replace("\\", "/", $name); 
		
		$fr = "\x50\x4b\x03\x04"; 
		$fr .= "\x0a\x00"; 
		$fr .= "\x00\x00"; 
		$fr .= "\x00\x00"; 
		$fr .= "\x00\x00\x00\x00"; 
		
		$fr .= pack("V",0); 
		$fr .= pack("V",0); 
		$fr .= pack("V",0); 
		$fr .= pack("v", strlen($name) ); 
		$fr .= pack("v", 0 ); 
		$fr .= $name; 
		$fr .= pack("V", 0); 
		$fr .= pack("V", 0); 
		$fr .= pack("V", 0); 
		
		$this -> datasec[] = $fr;
		$new_offset = strlen(implode("", $this->datasec)); 
		
		$cdrec = "\x50\x4b\x01\x02"; 
		$cdrec .="\x00\x00"; 
		$cdrec .="\x0a\x00"; 
		$cdrec .="\x00\x00"; 
		$cdrec .="\x00\x00"; 
		$cdrec .="\x00\x00\x00\x00"; 
		$cdrec .= pack("V",0); 
		$cdrec .= pack("V",0); 
		$cdrec .= pack("V",0); 
		$cdrec .= pack("v", strlen($name) ); 
		$cdrec .= pack("v", 0 ); 
		$cdrec .= pack("v", 0 ); 
		$cdrec .= pack("v", 0 ); 
		$cdrec .= pack("v", 0 ); 
		$ext = "\x00\x00\x10\x00"; 
		$ext = "\xff\xff\xff\xff"; 
		$cdrec .= pack("V", 16 ); 
		$cdrec .= pack("V", $this -> old_offset ); 
		$cdrec .= $name; 
		
		$this -> ctrl_dir[] = $cdrec; 
		$this -> old_offset = $new_offset; 
		return; 
	} 
	
	function add_file($data, $name) { 
		$fp = fopen($data,"r");
		$data = fread($fp,filesize($data));
		fclose($fp);
		$name = str_replace("\\", "/", $name); 
		$unc_len = strlen($data); 
		$crc = crc32($data); 
		$zdata = gzcompress($data); 
		$zdata = substr ($zdata, 2, -4); 
		$c_len = strlen($zdata); 
		$fr = "\x50\x4b\x03\x04"; 
		$fr .= "\x14\x00"; 
		$fr .= "\x00\x00"; 
		$fr .= "\x08\x00"; 
		$fr .= "\x00\x00\x00\x00"; 
		$fr .= pack("V",$crc); 
		$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); 
		$fr .= pack("V",$c_len); 
		$fr .= pack("V",$unc_len); 
		
		$this -> datasec[] = $fr; 
		$new_offset = strlen(implode("", $this->datasec)); 
		
		$cdrec = "\x50\x4b\x01\x02"; 
		$cdrec .="\x00\x00"; 
		$cdrec .="\x14\x00"; 
		$cdrec .="\x00\x00"; 
		$cdrec .="\x08\x00"; 
		$cdrec .="\x00\x00\x00\x00"; 
		$cdrec .= pack("V",$crc); 
		$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 ); 
		$cdrec .= pack("V", $this -> old_offset ); 
		
		$this -> old_offset = $new_offset; 
		
		$cdrec .= $name; 
		$this -> ctrl_dir[] = $cdrec; 
	} 
	
	function file() { 
		$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)) . 
			"\x00\x00"; 
	} 
}

require ("../../../../../webadmin/admin/connect_to_db.php");

// Skapa slumpmässigt kod som kommer vara kärnarn i hela utbytet mellan kund och znap
 $random = ""; 
 $antal = 5; 
 for ($n = 0; $n <= $antal; $n++)
 	{
	$random .= chr(rand(65,90));
	} 

// Zippa låtarna
$zipTest = new zipfile();
$zipTest->add_dir("$random/");

$sess_result = mysql_query("SELECT * FROM mp3");
while($row = mysql_fetch_array($sess_result))
		{ 
		 if($v1 == $row['id'])
				{
				$zipTest->add_file("../".$row['namn']."", "".$row['namn']."");
				}
		 if($v2 == $row['id'])
				{
				$zipTest->add_file("../".$row['namn']."", "../".$row['namn']."");
				} 

		}

			$filename = "$random.zip";
			$fd = fopen ($filename, "wb");
			$out = fwrite ($fd, $zipTest -> file());
			fclose ($fd);
			
			echo "<a href=\"" .$filename. "\">Click here to download the new zip file" .$random.".</a>";

?>
Medlem sedan juni 20001 251 inlägg
#2

1. Du definierar filnamn utanför loopen.

2. Du skriver/sparar filen utanför loopen.

278 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
141 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
147 ms — ändringar (db)