move_uploaded_file() ????

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • move_uploaded_file() ????

    Hallo zusammen

    ich habe ein klitze kleines Problem mit der obengenannten Funktion in meiner Upload Klasse. Eine Funktion dieser Klasse ist dafür zuständig die hochgeladenen Files je nach Dateierweiterung weiterzuverarbeiten. Bei jpeg und gif werden Thumbs erstellt und mit dem Originalbild bei der Ausgabe verlinkt. Das Problem sind die bmp Files. Diese soll die Fkt einfach aus dem Upload Ordner verschieben, dann einlesen und als GZip File zum Download anbieten. Funzt auch wunderbar, das GZip File wird korrekt heruntergeladen.
    Das Problem ist, dass der Name des bmp Files im Archiv falsch ist. Am Ende des Namens wird immer -Zahl angehängt. Die Zahl scheint aus dem tmp_name des Upload Files zu kommen (ist immer die letzte Zahl des Namens) und sieht so aus --> dateiname.bmp-1
    Wie kommt also PHP dazu diesen Namen zu verwenden v.a. da ich nicht die temporäre Datei, sondern die verschobene (mit neuem Namen) verwende.
    Bei allen anderen File Extesions funzt das wunderbar. Der einzige Unterschied ist, dass bei bmp Files das Einlesen des verschobenen Files im gleichen Aufruf des Objekts stattfindet. Bei den anderen Files wird erst auf die Ausgabeseite umgeleitet und dort das Objekt neu instanziert. Dann funzt es.
    Kann das ganze also daran liegen, dass ich versuche die Datei einzulesen und ggf move_uploaded_file() noch irgendwie auf die Datei zugreift ? Auf dem gesamten Server existiert kein File mit dem Namen wie er im GZip File vorkommt.

    Danke vielmals für Eure Tipps
    Gruss

    tobi
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

  • #2
    Hm, mal verschieben und dann den Namen ausgeben lassen....
    Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
    var_dump(), print_r(), debug_backtrace und echo.
    Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
    Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
    Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

    Kommentar


    • #3
      Der Name ist korrekt ohne diese besch.. Zahl am Ende. Die Fkt die das GZip macht liest die Datei ja mit dem neuen Namen ein und wenn dort noch die Zahl wäre, dann wäre diese Zahl auch im Namen des Archivs sichtbar, da ich einfach hinter den Filenamen noch '.gzip' anhänge und dann den Inhalt mittels header und echo an den Browser durchschicke.
      ausserdem exisitert die Datei so wie sie innerhalb des Archivs heisst auf dem gesamten Server nicht !! Auch der tmp_name war anders (nur die Zahl scheint daraus übernommen zu werden).

      Noch weitere Ideen oder ist dat ein Bug ?

      Gruss

      tobi
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        sowas kenn ich so ähnlich bei animierten Gif-Bildern - ich weiß jetzt nur ned genau bei welchem Verarbeitungsschritt das geschieht - ich glaub beim erzeugen der Thumbs mit imagemagick - da speichert er mir jeden Animationsschritt auch mit ner Ziffer nach dem Dateinamen ab und nicht mehr das komplette Gif - trifft natürlich nicht konkret auf deinen Fall zu aber vielleicht fällt dir dadurch was dazu ein.

        Was sagen Testausgaben der grad aktuellen Dateinamen beim jeweiligen Verarbeitungsschritt?
        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
        Schön - etwas Geschichte kann ja nicht schaden.
        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

        Kommentar


        • #5
          Was sagen Testausgaben der grad aktuellen Dateinamen beim jeweiligen Verarbeitungsschritt?
          Der aktuelle Dateinamen wird aus $this->name übernommen und dieser Wert wird aus dem name ermittelt, den der Client mit dem File beim Upload mitschickt.
          Nachdem move_uploaded_file() aufgerufen wurde (als Zielname wird $this->name übergeben) sehe ich das korrekte File mit dem korrekten Namen auf der Platte.
          auch das Einlesen geschieht über die Var $this->name und darum kann ich mir absolut nicht erklären warum sich dieser Name ändern sollte v.a. da ein var_dump($this->name) an verschiedenen Stellen nur die erwarteten Werte bringt. Wie gesagt wenn ich erst auf die Datei zugreifen will, wenn ich das Objekt neu instanziere, dann findet er die Datei ohne Probs und es ist auch keine Zahl im Namen enthalten.

          Gruss

          tobi
          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

          Kommentar


          • #6
            dann kanns ja fast nur noch am zippen liegen, oder? hab nur leider keine Ahnung von zippen mit PHP - verwendest du da was externes oder PHP eigene Zip-Funktionalitäten?
            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
            Schön - etwas Geschichte kann ja nicht schaden.
            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

            Kommentar


            • #7
              Ich verwende gzencode($this->name,9) um den kompremierten String zu erstellen. Dieser wird nach senden der entsprechenden Header mittels echo zum Download ausgegeben.
              Ich glaube nicht, dass es an dieser Fkt liegen kann, da das Ganze ja korrekt funzt, wenn ich das Objekt erst neu instanziere.
              Kann es sein dass move_uploaded_file() noch irgendwie den Finger auf der Datei hat, wenn das Script noch nicht zu Ende gelaufen ist ? Könnte daher die Zahl kommen ? Da diese ja jeweils immer vom tmp_name zu kommen scheint, muss doch der Fehler bei einer Funktion liegen, die diesen Namen noch kennt. Und da käme doch nur move.. in Frage. Alle anderen Funktionen kriegen nur den $this->name als Argument.

              Gruss

              tobi
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Hast du das Problem mit verschiedenen Browsern - oder nur mit einem (ganz bestimmten) ...?
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Was passiert, wenn du mal mit nem fixen Dateinamen testest?
                  Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                  Schön - etwas Geschichte kann ja nicht schaden.
                  Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                  Kommentar


                  • #10
                    @wahsaga
                    Nö in allen Browser.

                    @quetschi
                    Werde ich mal probieren sobald ich zu Hause bin. Kann mir aber nicht richtig vorstellen, dass es dann klappen könnte, weil der Name ja immer gleich bleibt (seit in eine Funktion ausgelesen und auf $this->name) und somit ja auch so was wie "fast" fix ist.
                    Und wie bereits geschrieben tritt das Problem nur auf wenn das Objekt nicht neu instanziert wird. Wenn neues Objekt dann funzt alles (mit dem gleichen Namen)

                    Gruss + Danke für Eure Hilfe

                    tobi
                    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                    Kommentar


                    • #11
                      @quetschi
                      So habe das jetzt mal mit fixen Namen getestet --> gleiches Problem. Da habe ich den fraglichen Codebereich mal aus dem Objekt rausgenommen und ein kleines Testform geschrieben. Dort funzt der Upload und das Erstellen der Gzip Files wunderbar und der Name des Files innerhalb des Archivs ist korrekt.
                      Stehen aber die gleichen Codezeilen wieder in einer Methode des Objekts, dann ist die Zahl im Namen wieder vorhanden.
                      Muss also irgendwie was mit dem Objekt zu tun haben, aber ich habe keinen Schimmer in welche Richtung es gehen könnte. Die Zahl scheint irgendwie ein interner Zähler zu sein, aber woher der kommt ??

                      Danke für jeden weiteren Tipp
                      Gruss

                      tobi
                      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                      Kommentar


                      • #12
                        Hier habe ich mal noch die fraglichen Stellen aus dem Quellcode. Vielleicht sieht jemand ja noch was...
                        Die Globals kommen aus dem Config File der Klasse. $this->name ist zum Zeitpunkt des Aufrufs temp.bmp und im GZip File aber temp.bmp-{irgendeinZähler} Auf der Festplatte liegt nur temp.bmp
                        PHP-Code:
                        private function createPic($tmp_name){
                           
                        /**Zuerst wird das File geprüft ob es überhaupt eine gültige Bilddatei ist
                           [...]
                            */
                            
                        switch($this->ext){
                                case 
                        'bmp':
                                   
                        move_uploaded_file($_FILES[$GLOBALS['feldname']]
                                   [
                        'tmp_name'],$GLOBALS['pfad'].$this->name);       
                                   
                        $this->createGZ($this->name,true,true);
                                break;
                            [...]
                            }

                        public function 
                        createGZ($datei,$gz=true,$header=true){
                            if(
                        $this->fehler === true) return false;
                            if(
                        $header === true){
                                if(
                        $gz === true){
                                     
                        $temp file_get_contents($GLOBALS['pfad'].$datei);
                                 
                        $temp gzencode($temp,9);
                                 
                        header('Content-Type: application/force-download');
                                 
                        header('Content-Disposition: attachment; 
                                     filename="'
                        .$datei.'.gz"');
                                 
                        header('Content-Length: '.strlen($temp));
                                 echo 
                        $temp;
                                     exit;
                                }else{... 
                        Danke für alle Tipps
                        Gruss

                        tobi
                        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                        Kommentar


                        • #13
                          hab mal gzencode im Manual nachgelesen - was ich grad nicht raffe:
                          wie weiß gzencode überhaupt, wie die Datei im Archiv heißen soll

                          der übergabeparameter ist ja lediglich der Inhalt der zu packenden Datei, aber nicht der Name.

                          Irgendwie steh ich da grad ein wenig daneben...
                          Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                          Schön - etwas Geschichte kann ja nicht schaden.
                          Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                          Kommentar


                          • #14
                            der übergabeparameter ist ja lediglich der Inhalt der zu packenden Datei, aber nicht der Name.
                            Woher genau das die Fkt weiss, schnall ich auch ned ganz. Aber bei jpg gif pdf txt csv funzt das Erstellen der Archive wie gewünscht und mit der gleichen Funktion. Der Name muss imho irgendwo im Datenstrom der Datei stecken, der via file_get_contents() gelesen wird.

                            Gruss

                            tobi
                            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                            Kommentar


                            • #15
                              Original geschrieben von jahlives
                              Der Name muss imho irgendwo im Datenstrom der Datei stecken, der via file_get_contents() gelesen wird.
                              Das glaube ich nicht, Tim ...


                              Ich vermute eher, dass das entpackende Programm ihn selber aus dem Namen der gepackten Datei herleitet, wenn darin keiner angegeben ist ...
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X