Verzeichnis mit Bildern auf dem Server packen

julia29

Erfahrenes Mitglied
Hallo,

ich möchte verschiedene Bildverzeichnisse auf dem Server packen.
Über die tar.class.php erhalte ich jedoch folgende Fehlermeldung:

Fatal error: Call to undefined method tar::addfile() in /var/kunden/webs/serv17/fotos/compress3.php on line 10
#Zeile 10 = unartest.php

Meine aufrufende php-Datei sieht wie folgend aus:

PHP:
<?php

#require("tar.php4class.php");
require("tar.class.php");
$tarfile=new tar("test1.tar");
$tarfile->addfile("untartest.php");
#$tarfile->addfile("browser.php");
#$tarfile->addfile("linkcheck.php");
$tarfile->write();
unset($tarfile);
?>

nicht benötigte Teile sind mit Kommentarzeichen versehen.
Wie muß ich die Zeile 10 definieren, damit eine Komprimierung durchgeführt werden kann?

-------------------------------
Habe es dann noch mit der gzencode Lösung versucht, findet aber die Bild-Datei über $path nicht, obwohl mit der gleichen URL korrekt im Browser aufrufbar.

PHP:
<?php 
    function zip_file($path) 
    { 
        $path_to = dirname($path); 
        $file = basename($path); 
        $file = current(explode(".",$file)); 
        echo $file.'<br />'; 
         
        if (file_exists($path)) 
        {     
            if (@system('zip '.$path_to.'/'.$file.$path)) 
            { 
                return true; 
            } 
             
            else if (@exec('zip '.$path_to.'/'.$file.'.zip '.$path)) 
            { 
                return true; 
            } 
             
            else if (@file_put_contents($path_to.'/'.$file.'.gz', @gzencode(@file_get_contents($path),9))) 
            { 
                return true; 
            } 
             
            else 
            { 
                echo 'Could not zip entry.'; 
                return false; 
            } 
             
        } 
         
        else 
        { 
            echo 'Entry does not exist.'; 
            return false; 
        } 
    } 
     
    $path = 'http://www.domain.de/bilder/05009.jpg'; 
    zip_file($path); 
?>

Was muss ich noch berücksichtigen damit das Bild gefunden wird.
Und das ganze Bildverzeichnis so../bilder/*.jpg oder würde das nicht funktionieren?

Die Fehlermeldung:
05009
Entry does not exist.

Gruß
Julia
 
Zuletzt bearbeitet:
hallo,

ohne deine quelltext näher zu kennen, es setzt natürlich vorraus "tar" und "zip" ist als Paket auch installiert auf deinen Server.

Gruss
 
Hallo,
ja, habe das gefunden:

zip
Zip enabled
Extension Version $Id: php_zip.c, v 1.1.2.15 2006/09/24 22:27:57 pajoye Exp $
Zip version 2.0.0
Libzip version 0.7.1

debian:~# tar --version
tar (GNU tar) 1.16
 
Hallo,

hier die beiden Angaben


Database Version: 5.0.32-Debian_7etch6-log
PHP Version: 5.2.0-8+etch11
Web Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11 mod_perl/2.0.2 Perl/v5.8.8
WebServer to PHP interface: apache2handler

PHP:
<?php
/**
 * @package PHPClassCollection
 * @subpackage Tar
 * @link classes
 * @author Dennis Wronka <reptiler@users.sourceforge.net>
 */
/**
 * @package PHPClassCollection
 * @subpackage Tar
 * @link classes
 * @author Dennis Wronka <reptiler@users.sourceforge.net>
 * @version 1.1
 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPL 2.1
 */
class tar
{
	/**
	 * The name of the tar-file to create.
	 *
	 * @var string
	 */
	private $filename;
	/**
	 * The list of files to add to the archive.
	 *
	 * @var array
	 */
	private $filelist=array();

	/**
	 * Constructor
	 *
	 * @param string $filename
	 */
	public function __construct($filename)
	{
		$this->filename=$filename;
	}

	/**
	 * Add a file.
	 *
	 * @param string $filename
	 */
	public function add($filename)
	{
		if ((file_exists($filename)) && (is_readable($filename)))
		{
			$this->filelist[]=$filename;
		}
	}

	/**
	 * Write the tar-file.
	 *
	 * @return bool
	 */
	public function write()
	{
		sort($this->filelist);
		$tarfile=@fopen($this->filename,'w');
		if ($tarfile==false)
		{
			return false;
		}
		for ($x=0;$x<count($this->filelist);$x++)
		{
			$filename=$this->filelist[$x];
			if ((is_dir($this->filelist[$x])) && (substr($this->filelist[$x],-1)!='/'))
			{
				$filename.='/';
			}
			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;
			}
			if (is_dir($this->filelist[$x]))
			{
				$filesize='0'.chr(0);
			}
			else
			{
				$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);
			if (function_exists('posix_getpwuid'))
			{
				$user=posix_getpwuid(octdec($userid));
				$user=$user['name'];
			}
			else
			{
				$user='';
			}
			while (strlen($user)<32)
			{
				$user.=chr(0);
			}
			if (function_exists('posix_getgrgid'))
			{
				$group=posix_getgrgid(octdec($groupid));
				$group=$group['name'];
			}
			else
			{
				$group='';
			}
			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;
	}
}
?>

mfg
Julia
 
Du schreibst im Aufruf:
PHP:
$tarfile->addfile("untartest.php");

Und in der Klasse steht:

PHP:
public function add($filename)

Fällt dir etwas auf?
 
hallo,

ja, passt nicht ganz, habe ich angeändert in

PHP:
require("tar.class.php");
$tarfile=new tar("test1.tar");
$tarfile->add("untartest.php");
$tarfile->add("browser.php");
$tarfile->add("linkcheck.php");
$tarfile->write();
unset($tarfile);
?>

hatte das Script eigentlich von hier und war der Annahme, dass dies bereits eine lauffertige Umgebung ist, aber dem ist wohl nicht so.
Hat jemand einen Link für mich wo bereits alles eingebunden ist? Habe Null Idee wie ich das überhaupt anfangen könnte.
Gibt es denn mit Linux-Bordmitteln keinen Befehl um ein ganzes Verzeichnis mit Bildern in ein Zip oder Tar zu verwandeln, ohne das ich dort wieder Programme installieren muss? Diese Versionen sind ja bereits installiert.
Zip version 2.0.0
Libzip version 0.7.1

debian:~# tar --version
tar (GNU tar) 1.16

mfg
Julia
 
Das Script dort arbeitet aber noch mit einer Pre-Release-Version meiner Klasse, dort hiess die Methode noch addfile().
Die Umbenennung in add() ist auch ganz einfach zu begruenden: Auch Verzeichnisse werden darueber hinzugefuegt. ;)

Uebrigens, eine Alternative zur Klasse koennte eventuell die Arbeit mit [phpf]exec[/phpf] oder [phpf]system[/phpf] sein. Darueber kannst Du direkt mit dem CommandLine-Tool tar arbeiten.
 
Zurück