Klasa wygląda następująco:
Kod
class zip {
var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;
function addFile($data, $name) {
$name = str_replace('\\', '/', $name);
$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 .= "\x00\x00\x00\x00"; // last mod time and date
$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;
$fr .= $zdata;
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$this->datasec[] = $fr;
$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 .= "\x00\x00\x00\x00"; // 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);
$this->old_offset += strlen($fr);
$cdrec .= $name;
$this->ctrl_dir[] = $cdrec;
}
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
}
function tofile($name) {
$f = fopen($name, "wb");
fwrite($f, $this->file());
fclose($f);
}
function todownload($name) {
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=$name");
echo $this->file();
}
}
var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;
function addFile($data, $name) {
$name = str_replace('\\', '/', $name);
$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 .= "\x00\x00\x00\x00"; // last mod time and date
$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;
$fr .= $zdata;
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$this->datasec[] = $fr;
$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 .= "\x00\x00\x00\x00"; // 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);
$this->old_offset += strlen($fr);
$cdrec .= $name;
$this->ctrl_dir[] = $cdrec;
}
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
}
function tofile($name) {
$f = fopen($name, "wb");
fwrite($f, $this->file());
fclose($f);
}
function todownload($name) {
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=$name");
echo $this->file();
}
}
Natomiast plik generuję w następujący sposób:
Kod
$dane = @mysql_fetch_array($zap);
$zip = new zip(); // tworzę nowy obiekt
$jeden = $dane['tytul_'.$ln];
$dwa = $dane['tresc_'.$ln];
$dane = "\n".$jeden."\n\n".$dwa;
//$dane = iconv("", "UTF-8", $dane);
$zip->addfile($dane, "tekst.rtf");
$zip->todownload("archiwum.zip");
$zip = new zip(); // tworzę nowy obiekt
$jeden = $dane['tytul_'.$ln];
$dwa = $dane['tresc_'.$ln];
$dane = "\n".$jeden."\n\n".$dwa;
//$dane = iconv("", "UTF-8", $dane);
$zip->addfile($dane, "tekst.rtf");
$zip->todownload("archiwum.zip");
Jakieś rady??
Częściowo doszedłem już do wniosku, iż wina leży w pobieranych danych z bazy. Bo gdy tekst nie zawiera polskich znaków, to wszystko jest ok, gdy jednak zawiera, wówczas pojawia się okno z wyborem kodowania. Ale co z tym dalej??