Dateien packen und archivieren.

RealScorp

Mitglied
Hallo,

ich habe im Augenblick ein Projekt laufen, bei dem u.a. eine recht gut benutzte Gallerie vorhanden ist (1800 Bilder mittlerweile).
Die Gallerie ist selbst geschrieben, und dahher auch nichts hochgestochenes, sondern eben nur ein einfaches Galleriescript.
Die Bilder die hochgeladen wurden werden halt mit den Attributen wie Titel/Dateiname/Kategorie usw in einer mysqlDB gespeichert.

Mein eigentliches Problem kommt jetzt:
Ich müsste es irgendwie hinbekommen die Dateien nach entsprechender Kategorie zu komprimieren (notfalls reicht auch ein Archiv, also ohne Kompression), und zum DL bereitzustellen.

Leider habe ich auf die Schnelle mit Suchfunktion etc nichts gefunden.

vielen Dank im vorraus

gruß Scorp
 
Hi,

danke für die schnelle Antwort, allerdings hätte ich erwähnen müssen, dass ich nicht die Möglichkeit habe, die PHP Installation auf meinem Webspace zu ändern, ich kann also keine Module installieren bzw neu kompilieren.
 
Fuer die PEAR-Komponenten musst Du in der Regel nichts aendern, da das eigentlich nur Klassen sind. Es kann aber sein, dass die PHP-Version dort ohne PEAR installiert wurde was dazu fuehren koennte, dass Du keine PEAR-Komponenten nutzen kannst.
Ich hab mal eine Klasse geschrieben mit denen Du Dateien in ein TAR-Archiv packen kannst, falls Dir dann noch gZip-Kompression zur Verfuegung steht koenntest Du dieses dann auch noch komprimieren. .tar.gz-Archive sind zwar eher unter Linux ueblich, aber lassen sich, nach meiner Erfahrung, auch mit den gaengigen Pack-Programmen unter Windows entpacken.
 
Meine PHP installation scheint keine PEAR unterstüzung zu haben, zumindest taucht das nirgendwo bei phpinfo() auf.

Wie gesagt, ein Script oder eine Funkrion die die Dateien archivieren kann (auch ohne Kompression) würde mir sehr weiterhelfen.
 
Ich kann Dir meine Klasse ja gern mal posten, ist zwar noch nicht ganz ausgetestet (darum gibt's die hier auch noch nicht), aber funktioniert soweit.

Uebrigens, hast Du da PHP 4 oder 5?
 
Ich habe wie gesagt über Google bzw die Suche hier mein Glück versucht, bin aber nicht Fündig geworden.
Wenn du deine Klasse posten könntest fände ich das super. Auf meinem Webserver ist PHP 4.3.10 installiert.
 
Brauchst Du auch die entsprechende Klasse um die Daten wieder auszupacken oder reicht es Dir wenn Du packen kannst?
So, hier mal die PHP4-Version meiner Tar-Klasse. Es fehlen zwar noch ein paar Checks, aber im Grunde ist sie funktionsfaehig.
tar.php4class.php
PHP:
<?php
/*
tar.class.php for PHP4
Version 0.8

Soon part of the PHP class collection
http://www.sourceforge.net/projects/php-classes/

Written by: Dennis Wronka
License: LGPL
*/
class tar
{
	var $filename;
	var $filelist;

	function tar($filename)
	{
		$this->filename=$filename;
		$this->filelist=array();
	}

	function addfile($filename)
	{
		$this->filelist[]=$filename;
	}

	function write()
	{
		$tarfile=fopen($this->filename,"w");
		for ($x=0;$x<count($this->filelist);$x++)
			{
				$filename=$this->filelist[$x];
				while (strlen($filename)<100)
					{
						$filename.=chr(0);
					}
				$permissions=sprintf("%o",fileperms($this->filelist[$x])).chr(0);
				while (strlen($permissions)<8)
					{
						$permissions='0'.$permissions;
					}
				$userid=sprintf("%o",fileowner($this->filelist[$x])).chr(0);
				while (strlen($userid)<8)
					{
						$userid='0'.$userid;
					}
				$groupid=sprintf("%o",filegroup($this->filelist[$x])).chr(0);
				while (strlen($groupid)<8)
					{
						$groupid='0'.$groupid;
					}
				$filesize=sprintf("%o",filesize($this->filelist[$x])).chr(0);
				while (strlen($filesize)<12)
					{
						$filesize='0'.$filesize;
					}
				$modtime=sprintf("%o",filectime($this->filelist[$x])).chr(0);
				$checksum="        ";
				if (is_dir($this->filelist[$x]))
					{
						$indicator=5;
					}
				else
					{
						$indicator=0;
					}
				$linkname="";
				while (strlen($linkname)<100)
					{
						$linkname.=chr(0);
					}
				$ustar="ustar  ".chr(0);
				$user=posix_getpwuid(octdec($userid));
				$user=$user['name'];
				while (strlen($user)<32)
					{
						$user.=chr(0);
					}
				$group=posix_getgrgid(octdec($groupid));
				$group=$group['name'];
				while (strlen($group)<32)
					{
						$group.=chr(0);
					}
				$devmajor="";
				while (strlen($devmajor)<8)
					{
						$devmajor.=chr(0);
					}
				$devminor="";
				while (strlen($devminor)<8)
					{
						$devminor.=chr(0);
					}
				$prefix="";
				while (strlen($prefix)<155)
					{
						$prefix.=chr(0);
					}
				$header=$filename.$permissions.$userid.$groupid.$filesize.$modtime.$checksum.$indicator.$linkname.$ustar.$user.$group.$devmajor.$devminor.$prefix;
				while (strlen($header)<512)
					{
						$header.=chr(0);
					}
				$checksum=0;
				for ($y=0;$y<strlen($header);$y++)
					{
						$checksum+=ord($header[$y]);
					}
				$checksum=sprintf("%o",$checksum).chr(0).' ';
				while (strlen($checksum)<8)
					{
						$checksum='0'.$checksum;
					}
				$header=$filename.$permissions.$userid.$groupid.$filesize.$modtime.$checksum.$indicator.$linkname.$ustar.$user.$group.$devmajor.$devminor.$prefix;
				while (strlen($header)<512)
					{
						$header.=chr(0);
					}
				fwrite($tarfile,$header);
				if ($indicator==0)
					{
						$contentfile=fopen($this->filelist[$x],"r");
						$data=fread($contentfile,filesize($this->filelist[$x]));
						while (strlen($data)%512!=0)
							{
								$data.=chr(0);
							}
						fwrite($tarfile,$data);
					}
			}
		fclose($tarfile);
		return true;
	}
}
?>
Und hier mal ein Beispiel:
PHP:
<?php
require("tar.php4class.php");
$tarfile=new tar("test.tar");
$tarfile->addfile("untartest.php");
$tarfile->addfile("browser.php");
$tarfile->addfile("linkcheck.php");
$tarfile->write();
unset($tarfile);
?>

Ach ja, ich hab jetzt diese PHP4-Version nicht getestet, sondern nur kurz das PHP5-Version angepasst.
 
Hallo,

zuerst mal vielen Dank für die Klasse, allerdings habe ich noch ein paar Probleme damit ;)
Zuerst scheint die Übergabe des Dateinamens beim Erstellen einer neuen Instanz der Klasse nicht zu funktionieren, wenn ich z.B. das Beispiel ausprobiere gibt er mir für jede Datei die ich versuche hinzuzufügen folgende Fehlerzeeilen:

Code:
Warning: fwrite(): supplied argument is not a valid stream resource in <path>/tar.php4class.php on line 121

Warning: fwrite(): supplied argument is not a valid stream resource in <path>/tar.php4class.php on line 130

Wenn ich in der Klasse den Dateinamen direkt zuweise, also sowas hier mache:

PHP:
[...]
class tar 
{ 
    var $filename="test.tar"; 
    var $filelist; 
[...]

es einwandfrei.

Wäre nett wenn du da nochmal kurz drüberschaun könntest, da ich vor allem bei PHP mit Klassen nur in der Theorie etwas vertraut bin, und nicht genau weiss, wo ich da bei der Fehlersuche anfangen sollte.

Ansonsten schonmal wie schon gesagt vielen Dank für die Klasse, sie scheint soweit mit php4 prima zu .

gruß Scorp
 
Zurück