Jnnbo: Bild kopieren

Hallo,

ich habe ein kleines Problem, möchte gerne ein Bild kopieren, erhalte aber nur den Wert "1" in der Datenbank, die Frage ist was mache ich falsch?

Der Code zum kopieren

$p_bild_neu = copy("img/produkte/".$p_bild,"img/produkte/".$tocken_foto);

In "$p_bild_neu" soll der neue Namen gespeichert werden In "$p_bild" steckt der alte Bildname In "$tocken_foto" steht eine Zufallszahl.

Seht ihr den Fehler?

  1. Tach!

    Seht ihr den Fehler?

    Ja, du hast die Beschreibung von copy() im PHP-Handbuch nicht gelesen.

    dedlfix.

    1. Hallo dedlfix,

      Ja, du hast die Beschreibung von copy() im PHP-Handbuch nicht gelesen.

      zwar nicht im PHP-Handbuch, aber hier

      1. Hallo dedlfix,

        also im PHP-Handbuch steht auch nicht mehr. Wenn ich es richtig verstanden habe, dann sollte es so richtig sein:

        $source = "img/produkte/";
        $file = $source.$p_bild;
        $p_bild = $source.$tockn_foto;
        $p_bild = copy($file, $p_bild);
        
        1. Hallo

          also im PHP-Handbuch steht auch nicht mehr. Wenn ich es richtig verstanden habe, dann sollte es so richtig sein:

          $source = "img/produkte/";
          $file = $source.$p_bild;
          $p_bild = $source.$tockn_foto;
          $p_bild = copy($file, $p_bild);
          

          Ist denn das Bild nach der Aktion an der gewünschten Stelle? Wenn ja, steht der neue Pfad in $source.$tockn_foto. Warum du die Variable mit dem Rückgabewert von copy überschreibst, weißt nur du allein. Und diesen Rückgabewert sprach dedlfix an. Lies dazu bitte noch einmal das Handbuch.

          Die Lösung ist zu simpel, als sie hier einfach so preiszugeben. :-)

          Tschö, Auge

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
          1. Hallo Auge,

            Ist denn das Bild nach der Aktion an der gewünschten Stelle? Wenn ja, steht der neue Pfad in $source.$tockn_foto. Warum du die Variable mit dem Rückgabewert von copy überschreibst, weißt nur du allein. Und diesen Rückgabewert sprach dedlfix an. Lies dazu bitte noch einmal das Handbuch.

            nicht wirklich :/ Auf dem Server entsteht eine Datei mit dem Namen "1826228501" kein Format nichts.

            1. Hallo

              Ist denn das Bild nach der Aktion an der gewünschten Stelle? Wenn ja, steht der neue Pfad in $source.$tockn_foto. Warum du die Variable mit dem Rückgabewert von copy überschreibst, weißt nur du allein. Und diesen Rückgabewert sprach dedlfix an. Lies dazu bitte noch einmal das Handbuch.

              nicht wirklich :/ Auf dem Server entsteht eine Datei mit dem Namen "1826228501" kein Format nichts.

              $source = "img/produkte/";
              $file = $source.$p_bild;
              $p_bild = $source.$tockn_foto;
              $p_bild = copy($file, $p_bild);
              

              Das da ist dein Code, der den alten Pfad bekannt macht ($file), den neuen Pfad festlegt ($p_bild), diese beiden Werte an die Funktion copy übergibt, die offensichtlich eine Datei (oben hast du 1826228501 angegeben) anlegt.

              Wie die Funktion es soll, gibt sie eine 1 für ein erfolgreiches kopieren der Datei zurück. Also, was fehlt?

              Tschö, Auge

              --
              Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
              1. Hallo Auge,

                Wie die Funktion es soll, gibt sie eine 1 für ein erfolgreiches kopieren der Datei zurück. Also, was fehlt?

                es fehlte die Endung, hab es nun so versucht umzusetzen, jetzt habe ich diese auch wieder

                	$kl = strstr($p_bild, '.');
                	$source = "img/produkte/";
                	$file = $source.$p_bild;
                	$p_bild = $source.$tocken_foto.$kl;
                	
                	copy($file, $p_bild);
                

                Jetzt habe ich ein anderes Problem, in $p_bild steht nun der vollständig Pfad also "img/produkte/2072190885.jpg" ich benötige aber nur "2072190885.jpg"

                1. Hallo

                  	$kl = strstr($p_bild, '.');
                  	$source = "img/produkte/";
                  	$file = $source.$p_bild;
                  	$p_bild = $source.$tocken_foto.$kl;
                  	
                  	copy($file, $p_bild);
                  

                  Jetzt habe ich ein anderes Problem, in $p_bild steht nun der vollständig Pfad also "img/produkte/2072190885.jpg"

                  So, wie du es zusammengestöpselt hast. Works as designed.

                  ich benötige aber nur "2072190885.jpg"

                  Du setzt den Pfad ($source), den Token (ohne „c“) ($tocken_foto) und die Endung ($kl) zusammen, kannst jedoch nicht den Token ($tocken_foto) und die Endung ($kl) ohne Pfad zusammensetzen?

                  Du kannst ja den letzten Schritt als ersten machen und zuerst den Dateinamen erstellen, den du dann an den Pfad hängst. Der Dateinahme steht dir hinterher aber weiterin als Variable zur Verfügung.

                  Tschö, Auge

                  --
                  Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
                  1. Hallo Auge,

                    Du setzt den Pfad ($source), den Token (ohne „c“) ($tocken_foto) und die Endung ($kl) zusammen, kannst jedoch nicht den Token ($tocken_foto) und die Endung ($kl) ohne Pfad zusammensetzen?

                    ich habe es jetzt so zusammengesetzt

                    	$kl = strstr($p_bild, '.');
                    	$source = "img/produkte/";
                    	$file = $source.$p_bild;
                    	$p_bild = $source.$tocken_foto.$kl;
                    	copy($file, $p_bild);
                    	$p_bild = $tocken_foto.$kl;
                    

                    Anders bekomme ich es nicht hin. Scheint aber zu funktionieren.

                    1. Hallo

                      Du setzt den Pfad ($source), den Token (ohne „c“) ($tocken_foto) und die Endung ($kl) zusammen, kannst jedoch nicht den Token ($tocken_foto) und die Endung ($kl) ohne Pfad zusammensetzen?

                      ich habe es jetzt so zusammengesetzt

                      	$kl = strstr($p_bild, '.');
                      	$source = "img/produkte/";
                      	$file = $source.$p_bild;
                      	$p_bild = $source.$tocken_foto.$kl;
                      	copy($file, $p_bild);
                      	$p_bild = $tocken_foto.$kl;
                      

                      Anders bekomme ich es nicht hin.

                      Erst den Namen in einer Variable zu speichern, die dir auch später zur Verfügung steht, und erst dann den gesamten Pfad für die Verwendung in copy zusammenzusetzen, geht nicht?

                      Scheint aber zu funktionieren.

                      Ja, bis die Kopie mal nicht erstellt werden kann. Dann wird der Dateiname in der Datenbank gespeichert, obwohl es diese Datei nicht gibt. Wenn jemand einen Dateinamen mit mehreren Punkten im Namen hochlädt, ist dein Token auch nur noch Teil des Namens. Aus Produkt.Wunderbar.jpeg wird 157895463.Wunderbar.jpeg. Dabei geht zwar nichts kaputt, aber du solltest das bei der Größenangabe deins Datenbankfeldes beachten. Wäre ja nicht das erste Mal, dass sowas zu Problemen führt. Andererseits gibt es gerade für Bilder eine Funktion, die den MIME-Typ ermittelt, womit sich die Endung verlässlich festlegen lässt.

                      $source = 'img/produkte/';
                      $dateiname = $token.$kl;
                      $neuerPfad = $source.$dateiname;
                      
                      $return = copy($alterPfad, $neuerPfad);
                      
                      if ($return !== false) {
                        // kopieren war erfolgreich
                        // speichere den Namen in der Datenbank
                      } else {
                        // kopieren ist gescheitert
                        // erzeuge Fehlermeldung (Email, Log, WasWeißIch)
                      }
                      

                      Tschö, Auge

                      --
                      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
        2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          also im PHP-Handbuch steht auch nicht mehr. Wenn ich es richtig verstanden habe, dann sollte es so richtig sein:

          Da steht aber nur das äußerliche Verhalten der Funktion beschrieben und auch, was ihr Rückgabewert bedeuten soll, nämlich (TRUE|FALSE) dass der Kopiervorgang geklappt hat.

          Wenn man aber genauer in die Funktion reinguckt, dann fragt man sich, ob sie den POSIX-Standard überhaupt berücksichtigt:

          • Sperren vor dem Lesen der Quelle
          • Anlegen des Ziels nur dann, wenn es noch nicht existiert
          • Sperren des (leeren) Ziels solange, bis es gefüllt wurde und wieder geschlossen

          Copy() ist noch ein sehr rudimentärer Befehl aus PHP, der überarbeitet werden müsste.

          Spirituelle Grüße
          Euer Robert
          robert.r@online.de

          --
          Möge der wahre Forumsgeist ewig leben!
      2. Hallo,

        Ja, du hast die Beschreibung von copy() im PHP-Handbuch nicht gelesen.

        zwar nicht im PHP-Handbuch, aber hier

        dann hast du anscheinend nicht verstanden, was du gelesen hast. Beide Quellen sind sich doch einig, dass copy() ein boolsches Ergebnis liefert. Nämlich true, wenn der Kopiervorgang gelungen ist, und false im Fehlerfall.

        Wieso erwartest du also stattdessen einen Dateinamen? Zumal einen Dateinamen, den du doch selbst zusammenbaust und an copy() übergibst?

        So long,
         Martin

        1. Hallo Der,

          dann hast du anscheinend nicht verstanden, was du gelesen hast. Beide Quellen sind sich doch einig, dass copy() ein boolsches Ergebnis liefert. Nämlich true, wenn der Kopiervorgang gelungen ist, und false im Fehlerfall.

          das wäre ja nicht das erste mal :/ Was ich erreichen möchte ist, dass mein Bild als Kopie auf dem Server liegt und zwar mit einem anderen Namen.

          Wieso erwartest du also stattdessen einen Dateinamen? Zumal einen Dateinamen, den du doch selbst zusammenbaust und an copy() übergibst?

          Wenn ich ein Bild kopiere, vergebe ich doch einen Dateinamen, wie soll ich das Bild sonst wieder finden?

          1. Hallo

            Wieso erwartest du also stattdessen einen Dateinamen? Zumal einen Dateinamen, den du doch selbst zusammenbaust und an copy() übergibst?

            Wenn ich ein Bild kopiere, vergebe ich doch einen Dateinamen, wie soll ich das Bild sonst wieder finden?

            Ja, den hast du, wie Martin schon schrieb, als zweiten Parameter an die Funktion copy übergeben.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
        2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          dann hast du anscheinend nicht verstanden, was du gelesen hast. Beide Quellen sind sich doch einig, dass copy() ein boolsches Ergebnis liefert. Nämlich true, wenn der Kopiervorgang gelungen ist, und false im Fehlerfall.

          Das taugt aber alles nichts!

          Spirituelle Grüße
          Euer Robert
          robert.r@online.de

          --
          Möge der wahre Forumsgeist ewig leben!
          1. Moin!

            Das taugt aber alles nichts!

            Wie meist Du das? Warum sollte der Befehl copy den Namen der Zieldatei zurück geben, den man ihm doch übergeben muss (der also schon vor dem Kopieren bekannt ist!) und nicht, ob das Kopieren erfolgreich war?

            Jörg Reinholz

            1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

              Das taugt aber alles nichts!

              Wie meist Du das? Warum sollte der Befehl copy den Namen der Zieldatei zurück geben, den man ihm doch übergeben muss (der also schon vor dem Kopieren bekannt ist!) und nicht, ob das Kopieren erfolgreich war?

              Wo habe ich das behauptet?
              Unterlasse bitte die Posting-Klitterung! :-D

              Lies lieber nochmal und schreib dann noch einmal.

              Spirituelle Grüße
              Euer Robert
              robert.r@online.de

              --
              Möge der wahre Forumsgeist ewig leben!
              1. Hallo

                Lies lieber nochmal und schreib dann noch einmal.

                Entschuldige mal bitte. Was soll man …

                Das taugt aber alles nichts!

                … an Gehaltvollem entnehmen und was soll man diesem einen Satz bei erneutem lesen mehr entnehmen? Er war schließlich der Einzige, den du in dem Posting von dir gabst.

                Tschö, Auge

                --
                Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
                1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                  Lies lieber nochmal und schreib dann noch einmal.

                  Entschuldige mal bitte. Was soll man …

                  Das taugt aber alles nichts!

                  … an Gehaltvollem entnehmen und was soll man diesem einen Satz bei erneutem lesen mehr entnehmen? Er war schließlich der Einzige, den du in dem Posting von dir gabst.

                  Ja, sorry. Ich habe da eben die Lupe auch sehr eng gezogen, aber mit einem eigenen größeren Kontext im Hintergrund (lesen des gesamten Threads). Das ist ja das Prpblem - auch unseres OPs Jnnbo. Der zeigt uns einen Ausschnitt aus seinem Programmier- und Denkbereich ohne Anbindung an den Kontext und erwartet, dass wir ihm eine vernünftige Antwort geben. So klappt das aber meistens nicht.

                  Jedenfalls ist der alte Befehl COPY() in PHP mMn nicht multithreadingfähig. Da können ganz interessante Sachen geschehen.

                  Spirituelle Grüße
                  Euer Robert
                  robert.r@online.de

                  --
                  Möge der wahre Forumsgeist ewig leben!
                  1. Hallo

                    Jedenfalls ist der alte Befehl COPY() in PHP mMn nicht multithreadingfähig. Da können ganz interessante Sachen geschehen.

                    Muss er das, gerade im Kontext seiner Aufgabe im Skript des OP, denn sein? Jemand lädt ein Bild herauf. Es wird eine Kopie angelegt und deren Dateiname soll in der DB gespeichert werden. Das, was hier dazwischenhauen kann, ist die eventuell vorhandene Gefahr, dass ein Token doppelt vergeben und, bei zusätzlicher Gleichheit der Dateiendung, deshalb ein Bild überschrieben wird. Das war's aber schon.

                    Tschö, Auge

                    --
                    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
                    1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                      Jedenfalls ist der alte Befehl COPY() in PHP mMn nicht multithreadingfähig. Da können ganz interessante Sachen geschehen.

                      Muss er das, gerade im Kontext seiner Aufgabe im Skript des OP, denn sein? Jemand lädt ein Bild herauf. Es wird eine Kopie angelegt und deren Dateiname soll in der DB gespeichert werden. Das, was hier dazwischenhauen kann, ist die eventuell vorhandene Gefahr, dass ein Token doppelt vergeben und, bei zusätzlicher Gleichheit der Dateiendung, deshalb ein Bild überschrieben wird. Das war's aber schon.

                      Mir ist das egal, wie es der Webseite des OP ergeht. Aber wenn ich das bei unseren Kunden zulassen würde, wäre das grob fahrlässig :-O

                      Spirituelle Grüße
                      Euer Robert
                      robert.r@online.de

                      --
                      Möge der wahre Forumsgeist ewig leben!
      3. Moin!

        Ja, du hast die Beschreibung von copy() im PHP-Handbuch nicht gelesen.

        zwar nicht im PHP-Handbuch, aber hier

        Dann hast Du es zwar gelesen, aber nicht verstanden. Du bekommst eine 1. das bedeutet, das Kopieren hat geklappt:

        Die Funktion gibt TRUE (bzw. 1) zurück, wenn der Kopiervorgang erfolgreich war, ansonsten FALSE (bzw. 0, z.B. wenn die angegebene Quelldatei nicht existiert).

        Woher Du die Information haben willst, dass nach einer Aktion wie

        $erg=copy('foo', 'bar'); 
        

        in $erg der Wert 'bar' (neuer Dateiname) stehen soll, erschließt sich nicht.

        Jörg Reinholz

        1. Hallo Jörg,

          Woher Du die Information haben willst, dass nach einer Aktion wie

          $erg=copy('foo', 'bar'); 
          

          in $erg der Wert 'bar' (neuer Dateiname) stehen soll, erschließt sich nicht.

          gelesen gar nicht. Ich lege eine neue Variable an mit dem Namen $erg und diese soll dann das Ergebnis von dem Kopieren haben, aber wie schon etwas weiter oben geschrieben es wird nicht mal richtig kopiert. Im Ordner befindet sich eine Datei "1665630527" ohne Endung.

          1. Hallo Jörg,

            jetzt habe ich den ersten Fehler gefunden, es muss so lauten

            $source = "img/produkte/";
            $file = $source.$p_bild;
            $p_bild = $source.$tocken_foto;
            	
            copy($file, $p_bild);
            

            Nur ich bekomme die Endung nicht mit kopiert, warum?

            1. Hallo

              $source = "img/produkte/";
              $file = $source.$p_bild;
              $p_bild = $source.$tocken_foto;
              	
              copy($file, $p_bild);
              

              Nur ich bekomme die Endung nicht mit kopiert, warum?

              Weil du sie nicht festlegst.

              Tschö, Auge

              --
              Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
            2. Moin!

              Ich sags mal so. Programmieren ist

              • "englisch für arme"
              • nicht "spannend"
              • eine Sache für "in Verwaltung" talentierte Heinis.
              • nichts für den der eher ein Künstler ist.
              <?php
              function specialJnnboCopy($sourceDirAndFileName, $targetDir=false, $errorType=E_USER_ERROR) {
              
                 # Prüfungen und Fehlerbehandlung
                 if (!  file_exists($sourceDirAndFileName) ) {
                    trigger_error ( "Eine nicht existierende Datei $sourceDirAndFileName kann nicht kopiert werden." , $errorType );
                    return false; # Falls  trigger_error mit E_USER_NOTICE erfolgt.
                 }
              
                 if (!  is_readable($sourceDirAndFileName) ) {
                    trigger_error ( "Eine nicht lesbare Datei $sourceDirAndFileName kann nicht kopiert werden." , $errorType );
                    return false; # Falls  trigger_error mit E_USER_NOTICE erfolgt.
                 }
              
              
                 if (! $targetDir) { # Wurde es gesetzt? Wenn nicht ist target-Dir = source-Dir:
                    $targetDir=dirname($sourceDirAndFileName); # gleiches Zielverzeichnis wie Quelle
                 }
              
                 # Prüfung, ob $targetDir existiert und beschreibbar ist:
              
                 if (! file_exists($targetDir) ) {
                    trigger_error ( "In ein nicht existierendes Verzeichnis $sourceDirAndFileName kann nicht kopiert werden." , $errorType );
                    return false; # Falls  trigger_error mit E_USER_NOTICE erfolgt.
                 }
              
                 if (!  is_writable($targetDir) ) {
                    trigger_error ( "In ein nicht beschreibbares Verzeichnis $sourceDirAndFileName kann nicht kopiert werden." , $errorType );
                    return false; # Falls  trigger_error mit E_USER_NOTICE erfolgt.
                 }
              
              
                 $fileExt = array_pop( exlode('.', $sourceDirAndFileName) ); # Dateinamens"erweiterung"
                 $bol = true;
              
                 while ( $bol ) {
                    $targetDirAndFileName = $targetDir . '/' . microtime(true) . '.' . $fileExt ; #Zeit als float)
                    if (! file_exists( $targetDirAndFileName ) ) {
                    # So lang es den Name schon gibt holen wir einfach einfach einen neuen ...
                       $written = copy ( $sourceDirAndFileName,  $targetDirAndFileName);
                       $bol = false;
                    }
                 }
              
                 if ($written) {
                    # Du willst den Name?
                    return $targetDirAndFileName;
                    # alternativ: Array aus Name und Größe
                    # return array($targetDirAndFileName, filesize ($targetDirAndFileName);
                 } else {
                    trigger_error ( "Das Kopieren von $sourceDirAndFileName nach $targetDirAndFileName schlug aus einem nicht berücksichtigtem Grund fehl." , $errorType);
                    return false; # Falls  trigger_error als Notice erfolgt.
                 }
              }
              

              Jörg Reinholz

              1. Tach!

                   # Prüfungen und Fehlerbehandlung
                   if (!  file_exists($sourceDirAndFileName) ) {
                      trigger_error ( "Eine nicht existierende Datei $sourceDirAndFileName kann nicht kopiert werden." , $errorType );
                      return false; # Falls  trigger_error mit E_USER_NOTICE erfolgt.
                   }
                
                   if (!  is_readable($sourceDirAndFileName) ) {
                      trigger_error ( "Eine nicht lesbare Datei $sourceDirAndFileName kann nicht kopiert werden." , $errorType );
                      return false; # Falls  trigger_error mit E_USER_NOTICE erfolgt.
                   }
                

                Die erste der beiden Prüfungen kann man auch weglassen. Eine nicht existierende Datei ist auch nicht lesbar. Lediglich die Fehlermeldung kann dann nicht beide Fälle unterscheiden. Aber muss sie das?

                Ebenso kann man die Prüfung des Ziel-Verzeichisses abkürzen.

                Wenn man es jedoch genau nimmt, leidet diese Art der Prüfung am TOCTTOU-Problem. Die Prüfung auf die Voraussetzungen und der eigentlich Kopiervorgang finden zeitlich nacheinander statt und theoretisch kann sich dazwischen der Zustand ändern. Wenn man das umgehen möchte, muss man einfach drauflos kopieren und im Nachhinein auf Fehler prüfen. Allerdings überschreibt copy() eventuelle Ziele gnadenlos und unverhinderbar. Es ist für solche Fälle nicht geeignet und man muss das Datei-Handling und -Sperren selbst in die Hand nehmen.

                $fileExt = array_pop( exlode('.', $sourceDirAndFileName) ); # Dateinamens"erweiterung"

                Strict Standards: Only variables should be passed by reference in ...

                array_pop() hätte gern eine Variable und kein On-the-fly-Array übergeben bekommen. Besser:

                $fileExt = pathinfo($sourceDirAndFileName, PATHINFO_EXTENSION);
                

                Vielleicht muss auch noch eine Prüfung der Endung auf erlaubte oder verbotene Werte stattfinden. Dateien mit php als Endung will man beispielsweise nicht entgegennehmen und aufrufbar irgendwo ins Web legen.

                dedlfix.

                1. Moin!

                  Wenn man das umgehen möchte, muss man einfach drauflos kopieren und im Nachhinein auf Fehler prüfen.

                  Wo wir - ganz genau genommen - auch wieder beim TOCTTOU-Problem ankommen :-(

                  $fileExt = pathinfo($sourceDirAndFileName, PATHINFO_EXTENSION);
                  

                  Das ist tatsächlich besser.

                  Vielleicht muss auch noch eine Prüfung der Endung auf erlaubte oder verbotene Werte stattfinden. Dateien mit php als Endung will man beispielsweise nicht entgegennehmen und aufrufbar irgendwo ins Web legen.

                  Fürwahr! Allerdings hatte Jnnbo das Problem ausgeklammert. Ich halte es ohnehin für merkwürdig, dass er die Datei in den selben Ordner kopieren will - da wäre also der Hase schon im Pfeffer. Die von Dir genannte Prüfung auf den Mime-Typ sollte deshalb aus meiner Sicht schon stattfinden bevor die Datei (wenn es ein User-Upload ist) aus dem tmp-Ordner geholt wird.

                  Zudem bin ich ein ausgesprochener Fan davon, Bilder durch imagick zu jagen. Imagick::getImageGeometry sollte reichen um gut und böse zu unterscheiden.

                  Jörg Reinholz

                  1. Tach!

                    Wenn man das umgehen möchte, muss man einfach drauflos kopieren und im Nachhinein auf Fehler prüfen.

                    Wo wir - ganz genau genommen - auch wieder beim TOCTTOU-Problem ankommen :-(

                    Eigentlich nicht. Der ideale Vorgang müsste so ablaufen wie beim Verhindern doppelter Datensätze in einem DBMS. Man schreibt einfach. Im Gut-Fall ist dann schon alles fertig und im Doppelt-Fall gibt es eine Unique-Constraint-Verletzung.

                    dedlfix.

                    1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                      Wenn man das umgehen möchte, muss man einfach drauflos kopieren und im Nachhinein auf Fehler prüfen.

                      Wo wir - ganz genau genommen - auch wieder beim TOCTTOU-Problem ankommen :-(

                      Eigentlich nicht. Der ideale Vorgang müsste so ablaufen wie beim Verhindern doppelter Datensätze in einem DBMS. Man schreibt einfach. Im Gut-Fall ist dann schon alles fertig und im Doppelt-Fall gibt es eine Unique-Constraint-Verletzung.

                      Siehe Wiki zum Thema Fileupload...

                      Kontrolliert speichern

                      Spirituelle Grüße
                      Euer Robert
                      robert.r@online.de

                      --
                      Möge der wahre Forumsgeist ewig leben!
          2. Hallo,

            Woher Du die Information haben willst, dass nach einer Aktion wie

            $erg=copy('foo', 'bar'); 
            

            in $erg der Wert 'bar' (neuer Dateiname) stehen soll, erschließt sich nicht.

            gelesen gar nicht.

            sondern?

            Ich lege eine neue Variable an mit dem Namen $erg und diese soll dann das Ergebnis von dem Kopieren haben

            Ja, und das Ergebnis des Kopierens ist der Wert TRUE für "hat funktioniert".

            aber wie schon etwas weiter oben geschrieben es wird nicht mal richtig kopiert. Im Ordner befindet sich eine Datei "1665630527" ohne Endung.

            Natürlich, genau das tut doch die Anweisung, die du im Startposting gezeigt hast:

            $p_bild_neu = copy("img/produkte/".$p_bild,"img/produkte/".$tocken_foto);
            
            

            Du sagst doch selbst:

            In „$tocken_foto“ steht eine Zufallszahl.

            Und genau diese Zufallszahl übergibst du als Dateinamen, den die Kopie bekommen soll. Works as designed.

            So long,
             Martin