phpbar.de logo

Mailinglisten-Archive

[php] move_uploaded_file() nicht wie erwartet...

[php] move_uploaded_file() nicht wie erwartet...

tobi tobi at tobisworld.ch
Mit Mar 15 15:14:56 CET 2006


Hallo zusammen,

zuerstmal, das ist mein erstes Post auf eine Mailinglist. Hoffentlich 
könnt ihr mir das nachsehen.

Mein Problem ist, dass ich eine Upload Klasse geschrieben habe, die aber 
in einem bestimmten Fall nicht wie gewünscht funzt. Nach dem Upload des 
File verschiebe ich dieses mit move_uploaded_file() in ein anderes 
Verzeichnis. Von dort liest eine andere Funktion das File ein und jagt 
den String durch gzencode(). Dann werden die entsprechenden header für 
einen Download ausgegeben und der gezippte String wird mittels echo 
ausgegeben.
Das ganze funkioniert auch gut nur bei bmp Files geht das ganze ziemlich 
schief:
Im Namen des Files im Archiv taucht am Ende immer eine Zahl auf. Diese 
wird aber nicht an die Funktion übergeben. Es scheint mir als sei die 
Zahl ein Zähler wieoft die Datei mit diesem Namen bereits hochgeladen 
wurde. Beim ersten Hochladen der Datei test.bmp ist der Name des Archivs 
korrekt test.bmp.gz und der Name im Archiv korrekt test.bmp.
Wenn ich jetzt aber die Datei zum zweiten Mal hochlade dann ist der Name 
im Archiv test.bmp-1 Bei jedem weiteren Versuch wird diese Zahl 
hochgezählt. Wenn der Computer längere Zeit im StandBy oder 
ausgeschaltet war, dann funzt es wieder einmal korrekt.
Ich habe mir folgenden kurzen Testcode geschrieben, der dieses Problem 
bei mir reproduzierbar ab dem 2. Upload desselben Files zu Tage bringt. 
Das ganze ist nur der Testcode drum habe ich keine Datenvalidierung drinn.

<?php
error_reporting(E_ALL);

if(isset($_FILES['datei']) && isset($_POST)){
    class upload{
        public function createFile($name){
            
move_uploaded_file($_FILES['datei']['tmp_name'],$_SERVER['DOCUMENT_ROOT'].'/upload/'.$name);
            $this->createGZ($name);
        }
        public function createGZ($name){
            $temp = 
implode('',file($_SERVER['DOCUMENT_ROOT'].'/upload/'.$name));
            $temp = gzencode($temp,9);
            header('Content-Type: application/force-download');
            header('Content-Disposition: attachment; 
filename="'.$name.'.gz"');
            header('Content-Length: '.strlen($temp));
            echo $temp;
            exit;
        }
    }
    $temp = new upload();
    $temp->createFile($_FILES['datei']['name']);
    $temp->createGZ($_FILES['datei']['name']);
}else{
?>
    <html>
    <head>
    <title>TestClass</title>
    </head>
    <body>
    <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" 
enctype="multipart/form-data">
    <input name="datei" type="file" /><br />
    <input type="submit" />
    </form>
    </body>
    </html>
<?php
}
?>

Ich komme hier auch nicht mehr weiter, weil der gleiche Code für andere 
Dateiendungen korrekt geht. Ich habe es auch schon in Foren versucht, 
aber dort wusste niemand was und mir wurde empfohlen mich an die 
PHPMailingliste zu wenden.

Vielen Dank für Eure Hilfe

php::bar PHP Wiki   -   Listenarchive