Avatar billede radion Nybegynder
26. juli 2005 - 14:25 Der er 7 kommentarer og
1 løsning

danske tegn bliver bliver til underlige tegn ved zipdownload

Hej Eksperter

Jeg bruger nedenfølgende class til at lave zip filer.. men, når jeg gør det og filerne bruger æøå i navnene bliver æøå omdannet til et underligt alternativ. "Sådan_gør_vi" bliver til "SÕdan_g°r_vi"

hvad kan der være galt?




<?
//$zipfile = new zipfile();
//$zipfile -> add_dir("nyt_bibliotek");
//$filedata="hejsa, her er noget tekt";
//$zipfile -> add_file($filedata,"nyt_bibliotek");
//header("Content-type: application/octet-stream"); 
//header("Content-disposition: attachment; filename="nyzip.zip"); 
//echo $zipfile -> file(); 

class zipfile 
    { 

        var $datasec = array(); // array to store compressed data
        var $ctrl_dir = array(); // central directory 
        var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
        var $old_offset = 0;

        function add_dir($name) 

        // adds "directory" to archive - do this before putting any files in directory!
        // $name - name of directory... like this: "path/"
        // ...then you can add files using add_file with names like "path/file.txt"
        { 
            $name = str_replace("\\", "/", $name); 

            $fr = "\x50\x4b\x03\x04";
            $fr .= "\x0a\x00";    // ver needed to extract
            $fr .= "\x00\x00";    // gen purpose bit flag
            $fr .= "\x00\x00";    // compression method
            $fr .= "\x00\x00\x00\x00"; // last mod time and date

            $fr .= pack("V",0); // crc32
            $fr .= pack("V",0); //compressed filesize
            $fr .= pack("V",0); //uncompressed filesize
            $fr .= pack("v", strlen($name) ); //length of pathname
            $fr .= pack("v", 0 ); //extra field length
            $fr .= $name; 
            // end of "local file header" segment

            // no "file data" segment for path

            // "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));

            // ext. file attributes mirrors MS-DOS directory attr byte, detailed
            // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp

            // now add to central record
            $cdrec = "\x50\x4b\x01\x02";
            $cdrec .="\x00\x00";    // version made by
            $cdrec .="\x0a\x00";    // version needed to extract
            $cdrec .="\x00\x00";    // gen purpose bit flag
            $cdrec .="\x00\x00";    // compression method
            $cdrec .="\x00\x00\x00\x00"; // last mod time & date
            $cdrec .= pack("V",0); // crc32
            $cdrec .= pack("V",0); //compressed filesize
            $cdrec .= pack("V",0); //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
            $ext = "\x00\x00\x10\x00";
            $ext = "\xff\xff\xff\xff"; 
            $cdrec .= pack("V", 16 ); //external file attributes  - 'directory' 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 array
            $this -> ctrl_dir[] = $cdrec; 

           
        }


        function add_file($data, $name) 

        // adds "file" to archive 
        // $data - file contents
        // $name - name of file in archive. Add path if your want

        { 
            $name = str_replace("\\", "/", $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; 
            // end of "local file header" segment
           
            // "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 .="\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 ); //relative offset of local header
    //      &n // bsp; echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>";
            $this -> old_offset = $new_offset;

            $cdrec .= $name; 
            // optional extra field, file comment goes here
            // save to central directory
            $this -> ctrl_dir[] = $cdrec; 
        }

        function file() { // dump out 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
        }
    }
    ?>
Avatar billede hmortensen Nybegynder
26. juli 2005 - 14:39 #1
Normalt bruger man aldrig special tegn i filnavne.
Avatar billede radion Nybegynder
26. juli 2005 - 17:00 #2
Nej, det er jeg klar over... men det har jeg nogle brugere der er pænt ligeglade med... så derfor er det vigtigt at man kan bruge det..
Avatar billede hmortensen Nybegynder
26. juli 2005 - 17:02 #3
Du kunne replace special tegn med andre tegn. fx æ = ae osv. eller lave et tjek på om filen har ulovlige tegn, og så afvise den.
Avatar billede radion Nybegynder
26. juli 2005 - 17:07 #4
jeps, det har jeg også gjort.. men nu ønsker folket at der kan bruges æøå
Avatar billede radion Nybegynder
26. juli 2005 - 20:19 #5
ingen der kan hjælpe??
Avatar billede radion Nybegynder
30. januar 2006 - 00:53 #6
lukker
Avatar billede htx98i17 Professor
28. maj 2006 - 20:23 #7
kan du ikke bare replace som sagt, og inden filnavnet vises igen for brugeren, replace tilbage...
Avatar billede Slettet bruger
28. maj 2006 - 21:26 #8
urlencode og urldecode dine filnavne?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester