Sind solche Dateioperationen möglich?

benniwm

Grünschnabel
Guten Abend,

Kann ich per PHP zum Beispiel einen Ordner auf meinem Server in ein Archiv packen?
RAR oder Zip oder ähnliches halt...
Geht um Folgendes:
Ich habe nen Webserver laufen auf den mein Vater täglich fast von der Arbeit seine Daten speichert.(Er arbeitet die ganze Woche 300km von zu Hause weg und kommt nur am WE heim).

Jetzt würde ich gerne mit PHP folgendes schreiben:
Es wird die Liste der täglich angelegten Ordner gezeigt.
Diese kann ich einzeln per Checkbox auswählen.
Dann soll eben entweder für jeden Ordner einzeln oder für alle zusammen Archive gepackt werden!

Ich habe noch nicht viel mit PHP gemacht drum wollte ich jetzt mal wissen wie ich des am Besten mache, wenns überhaupt möglich ist!
Aber phpmyadmin kann ja auch Tabellen als Archiv exportieren... von dem her dachte ich das es möglich sei!

mfg
benni
 
also möglich dürfte es sein, aber leider kann ich dir nicht sagen, wie genau es klappt, denn in der Rubrik von PHP habe ich mich noch nicht schlau gemacht...such ma im forum nach zip. oder rar packen/komprimieren oder auch ma google ;-)

MFG Niels
 
Hallo,

weil mich das Thema selbst interessiert hat, als ich es gelesen hab, habe ich mich mal ein bisschen schlau gemacht :google: Das war aber nicht einfach, weil die Beschreibung http://de.php.net/manual/de/ fehlerhaft ist.

Das ist nur ein Beipiel! Musst das dann auf deine Situation anpassen und umschreiben.


Angenommen du hast eine Datei:

test.txt
Code:
Das ist ein Beispieltext in der Datei!

Die Klasse zipfile:
PHP:
<?php
/* $Id: zip.lib.php,v 2.4 2004/11/03 13:56:52 garvinhicking Exp $ */
// vim: expandtab sw=4 ts=4 sts=4:


/**
 * Zip file creation class.
 * Makes zip files.
 *
 * Based on :
 *
 *  http://www.zend.com/codex.php?id=535&single=1
 *  By Eric Mueller <eric@themepark.com>
 *
 *  http://www.zend.com/codex.php?id=470&single=1
 *  by Denis125 <webmaster@atlant.ru>
 *
 *  a patch from Peter Listiak <mlady@users.sourceforge.net> for last modified
 *  date and time of the compressed file
 *
 * Official ZIP file format: http://www.pkware.com/appnote.txt
 *
 * @access  public
 */
class zipfile
{
    /**
     * Array to store compressed data
     *
     * @var  array    $datasec
     */
    var $datasec      = array();

    /**
     * Central directory
     *
     * @var  array    $ctrl_dir
     */
    var $ctrl_dir     = array();

    /**
     * End of central directory record
     *
     * @var  string   $eof_ctrl_dir
     */
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";

    /**
     * Last offset position
     *
     * @var  integer  $old_offset
     */
    var $old_offset   = 0;


    /**
     * Converts an Unix timestamp to a four byte DOS date and time format (date
     * in high two bytes, time in low two bytes allowing magnitude comparison).
     *
     * @param  integer  the current Unix timestamp
     *
     * @return integer  the current date in a four byte DOS format
     *
     * @access private
     */
    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);
    } // end of the 'unix2DosTime()' method


    /**
     * Adds "file" to archive
     *
     * @param  string   file contents
     * @param  string   name of the file in the archive (may contains the path)
     * @param  integer  the current timestamp
     *
     * @access public
     */
    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);
        $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
        $c_len   = strlen($zdata);
        $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)
        // nijel(2004-10-19): this seems not to be needed at all and causes
        // problems in some cases (bug #1037737)
        //$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;

        // 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 += strlen($fr);

        $cdrec .= $name;

        // optional extra field, file comment goes here
        // save to central directory
        $this -> ctrl_dir[] = $cdrec;
    } // end of the 'addFile()' method


    /**
     * Dumps out file
     *
     * @return  string  the zipped file
     *
     * @access public
     */
    function file()
    {
        $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
    } // end of the 'file()' method

} // end of the 'zipfile' class
?>


Und hier die Datei die du ausführst:
zip.php
PHP:
<?php

require("./zip.lib.php");

	$archivname = "Archiv_23_12_06.zip";  // Beispielname für dein Archiv


	$zip = new zipfile();				  // Objekt anlegen

	$filename = "test.txt";				  // Name der Datei die archiviert werden soll
	
    
    // Inhalt der Datei auslesen
    $handle = fopen ($filename, "r");	  // Nicht vergessen, Pfad muss stimmen	
	$content = fread ($handle, filesize ($filename));
	fclose ($handle);
	
	
	// Datei in Zipfile speichern (in das Objekt)
	//             Inhalt,  Dateiname, Datum und Uhrzeit der letzten Dateiänderung
	$zip->addFile($content, $filename, filemtime($filename));

	
	
	// Zip File speichern, falls nicht vorhanden anlegen
	$handle = fopen ($archivname, "a+");
    fwrite($handle,$zip->file());
    fclose($handle);



?>

Es sind jetzt keine Ausgaben oder ähnliches da, aber wenn es sauber läuft (sollte es) hast du in deinem Ordner dann ein Zip-Archiv in dem die Datei test.txt drin ist.

Ich hoffe, ich konnte dir helfen. Frohes Fest!
 
Zurück