Problem mit ZIP in PHP
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
archiv
beitrag
bit
byte
checken
codex
compression
date
datei
extra
format
gen
klasse
lesen
mimen
packen
purpose
segment
single
window
-
Hallo,
ich habe hier in der Arbeit ein Script erstellt welches verschiedene Dateien auf dem Server als ZIP Packt und dem User zur verfügung stellt.
Der Webserver läuft unter Windows 2000.
Geht der User jetzt mit Win 2000 auf die Seite und lädt die Datein herunter, so erhält er eine richtige WinZip Datei.
Geht er aber mit XP auf die Seite erhält er eine GZ Datei.
Kann mir jemand sagen warum ich unter XP kein ZIP sondern GZ erhalte?
Hier der Code des Downloadscripts:
<?php include ("zip_class.php"); if (isset($_POST["zeichnung"]) == FALSE and isset($_POST["stueck"]) == FALSE){ $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'index.php?b='.$_POST["bestellung"]; header("Location: http://$host$uri/$extra"); exit; } $zip=new zipfile; for ($i=0; $i<count($_POST["zeichnung"]); $i++) { $file = $_POST["zeichnung"][$i]; if (file_exists("./files/".$file)){ $zip->addFile(file_get_contents("./files/".$file),$file,time()); } } for ($i=0; $i<count($_POST["stueck"]); $i++) { $file = $_POST["stueck"][$i]; if (file_exists("./files/".$file)){ $zip->addFile(file_get_contents("./files/".$file),$file,time()); } } $mime="application/x-gzip"; header('Content-Type: '.$mime); header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Content-Disposition: inline; filename="'.$_POST["bestellung"].'.zip"'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); //send zipfile echo $zip->file(); exit; ?>
Danke,
Marco
Beitrag geaendert: 20.4.2007 11:54:49 von blindripper -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Das Problem scheint in der Zip-Klasse zu liegen, hast du die selbst geschrieben oder igendwo herbekommen?
Kannst sie ja mal posten, falls sie nicht zu groß ist.
ps3web -
Hier die Zip-Klasse:
<?php /** * 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) $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 ?>
Beitrag geaendert: 20.4.2007 11:53:52 von blindripper
Beitrag geaendert: 20.4.2007 11:54:20 von blindripper -
Also bei mir existiert der [code] BBCode...
Bei dir nicht? -
[..] $mime='application/x-gzip'; [..]
Dem Mime-Type zufolge erwartet der Browser eine Gzip-Datei.
Dass unter Windows XP eine gz-Datei heruntergeladen wird, liegt im Fehlen eines geeigneten Programmes zum Öffnen solcherlei Dateien (wie bspw. WinZip).
Mit dem Ändern des Mime-Type zu "application/zip" dürfte das Problem verschwinden. -
[..] $mime='application/x-gzip'; [..]
Dem Mime-Type zufolge erwartet der Browser eine Gzip-Datei.
Dass unter Windows XP eine gz-Datei heruntergeladen wird, liegt im Fehlen eines geeigneten Programmes zum Öffnen solcherlei Dateien (wie bspw. WinZip).
Mit dem Ändern des Mime-Type zu "application/zip" dürfte das Problem verschwinden.
Danke das war das Problem -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage