Verzeichnis zippen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
archiv
array
bild
bit
code
datei
disk
file
header
http
input
null
pack
problem
segment
start
suffix
type
url
verzeichnis
-
hi,
ich hab ein verzeichnis mit bildern.
nun soll den usern die mögichkeit bestehen das gesamte verzeichnis via zip zu downloaden.
da aber immer wieder neue bilder in das verzeichniss kommen, möchte ich nicht jedesmal eine neue zip datei hochladen müssen...
ich hab auch in google zahlreiche scripts gefunden, die automatisch alle dateien in eine zip datei verpacken und diese gleich als download ausgeben. funktioniert hat aber keindes
habt ihr mir rat?
gruß -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Was ist jetzt so schwierig daran die Zip Funktionen mit opendir() zu verknüpfen ?
http://de3.php.net/manual/de/book.zip.php
http://de3.php.net/manual/de/function.opendir.php
Mit Opendir() liest du dein Verzeichnis aus und anstatt die Namen auszugeben fügst du die Dateien zum Archiv dazu. fertig.
Dein größeres Problem wird sein, dass hier bie Lima die Zip Extension nicht geladen ist und wie ich die Herren kenne auch nicht so schnell geladen wird ...heißt also packen über PHP nicht möglich.
Grüßle
Edit: Links als Links markiert
Beitrag zuletzt geändert: 15.5.2009 13:24:00 von scout -
das problem ist einfach das ich php nicht beherrsche, bzw. nicht kann
hab aber über google einiges gefunden das so arbeitet wie du es mir geraten hast.
aber wie du schon selber sagst... kein erfolg
ich hab aber mitlerweile eine lösung gefunden. eine unpraktische, aber es geht.
ich habe das file zip.lib.php in verknüpfung mit der datei zipper.php (google wirds finden) in benutzung.
sehr unforteilhaft ist leider das die datei "zipper.php" in den zielordner mit rein muss und mit dem archiv gedownloadet wird. ebenso lässt sich die gedownloadete archiv.zip nur mit winrar öffnen. der standart dienst von windows erkennt die datei als ungültige anwendung.
man kann die zipper.php angeblich auch außerhalb des zu downloadenden verzeichnis stellen und über eine pfadangabe das zielverzeichnis angeben. dann ist die gedwonloadete datei allerdings leer
vielleicht hat ja jm. das gleiche script laufen bei dem es funktionert...
zipper.php
<?php // start output buffering ob_start(); // load zipfile class require("../zip.lib.php"); // create a zipfile object $zipfile = new zipfile('archive.zip'); // add files in current directory $zipfile->addDirContent('./'); // show zipfile echo $zipfile->file(); ?>
und
zip.lib.php
<?php 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; var $pathToFPDF = NULL; var $pathToDeepDir = NULL; function zipfile ($output_filename = 'archive.zip', $DeepDir = './DeepDir.php', $FPDF = './fpdf.php') { //header("Content-type: application/octet-stream"); header('Content-Type: application/zip'); header('Content-disposition: attachment; filename="' . $output_filename . '"'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); $this->pathToFPDF = $FPDF; $this->pathToDeepDir = $DeepDir; } function read_File ($file) { if (is_file($file)) { $fp = fopen ($file, 'rb'); $content = fread ($fp, filesize($file)); fclose ($fp); return $content; } } function replaceSuffix ($file, $suffix = 'pdf') { $arr = explode('.', $file); unset($arr[count($arr) - 1]); $file = NULL; foreach($arr as $v) $file .= $v . '.'; $file .= $suffix; return $file; } function getDirContent ($dirName = './') { if (is_dir($dirName)) { if (include($this->pathToDeepDir)) { $dir = new DeepDir(); $dir->setDir($dirName); $dir->load(); return $dir->files; } else { if ($handle = opendir($dirName)) { while (false !== ($file = readdir($handle))) { if (($file != '.') && ($file != '..') && (is_file($file))) { $content[] = $file; } } closedir($handle); return $content; } } } } function addDirContent ($dir = './') { foreach ($this->getDirContent($dir) as $input) { $this->addFileAndRead(str_replace('.//', NULL, $input)); } } function addFileAndRead ($file) { if (is_file($file)) $this->addFile($this->read_File($file), $file); } function addFileAsPDF ($file, $title = 'PDF File', $author = 'Anonymous') { //You need FPDF to use this function! //get it at http://www.fpdf.org/ if (include($this->pathToFPDF)) { $pdf = new PDF(); $pdf->Open(); //edit this as you need it $pdf->SetTitle($title); $pdf->SetAuthor($author); $pdf->PrintChapter(1, $author, $file); //nothing to edit below! $this->addFile($pdf->getBuffer(), $this->replaceSuffix($file)); } else { $filecontent = implode(NULL, file($file)); $content .= '********************************************' . "\n"; $content .= '* *' . "\n"; $content .= '* Couldn\'t find FPDF! *' . "\n"; $content .= '* Adding this File as plain text file. *' . "\n"; $content .= '* *' . "\n"; $content .= '* Below this box is the sourcefile. *' . "\n"; $content .= '* *' . "\n"; $content .= '********************************************' . "\n"; $content .= ' ' . "\n"; $content .= ' ' . "\n"; $content .= ' ' . "\n"; $content .= $filecontent; $this->addFile($content, $file); } } 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; } 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 = "\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) $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 = "\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 = $new_offset; $cdrec .= $name; // optional extra field, file comment goes here // save to central directory $this -> ctrl_dir[] = $cdrec; } function file() { $data = implode(NULL, $this -> datasec); $ctrldir = implode(NULL, $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 } } ?>
-
Hallo,
und was ist, wenn du statt
$zipfile->addDirContent('./');
einfach
$zipfile->addDirContent("ein/anderer/pfad");
schreibst. laut erklärung des scriptes müsste es dann eigentlich funktionieren.
Gruß Tillorgias -
hab ich bereits ausprobiert.
das script funktioniert dann allerdings nicht richtg. es wird eine leere zip datei erstellt und man kann somit nichts runterladen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage