Bildskalierung im UploadScript & move_uploaded_file...

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

  • Bildskalierung im UploadScript & move_uploaded_file...

    Hi,

    Kenn mich nicht so gut mit PHP aus, kann gerade mal die Scripts vernünftig einbinden, jetzt mein Problem:
    habe im Netz ein einfaches Bild-Upload script gefunden, welches die Bilder auf die richtige Größe skaliert. Das Script funktionier super, allerdings wird nur eine Maximale Breite festgelegt. Sieht n bisschen blöd aus, bei Bildern im Hochformat, da die Höhe dann wieder den Rahmen sprengt. Also wie kann ich hier noch zusätzlich die maximal Höhe des Bildes definieren?

    Die zweite Frage ist, wie ich das Zielverzeichnis für die hochgeladenen Dateien bestimmen kann, habs so versucht:

    $uploaddir = '/gfx/';
    $uploadfile = $uploaddir. $_FILES['bild']['name'];

    und im script an der entsprechenden stelle
    ... if( !@move_uploaded_file( $_FILES['bild']['tmp_name'], $uploadfile) ) ...

    geht aber nicht oO

    PHP-Code:
    <?php
    // Funktion zum Thumbnail erstellen

    function BildScale$Grafikdatei$ThumbnailBreite ) {

        
    $Bilddaten getimagesize$Grafikdatei );

        
    $OriginalBreite $Bilddaten[0];
        
    $OriginalHoehe $Bilddaten[1];

        if( 
    $OriginalBreite $ThumbnailBreite ) {
            
    $ThumbnailBreite $OriginalBreite;
        }
        
    $Skalierungsfaktor $OriginalBreite/$ThumbnailBreite;
        
    $ThumbnailHoehe intval$OriginalHoehe/$Skalierungsfaktor );


        
    $Originalgrafik imagecreatefromjpeg$Grafikdatei );
        
    $Thumbnailgrafik imagecreatetruecolor$ThumbnailBreite$ThumbnailHoehe );
        
    imagecopyresampled$Thumbnailgrafik$Originalgrafik0000$ThumbnailBreite$ThumbnailHoehe$OriginalBreite$OriginalHoehe );
        
    imagejpeg$Thumbnailgrafik$Grafikdatei90 );

        
    imagedestroy$Originalgrafik );
        
    imagedestroy$Thumbnailgrafik );
    }

    // Wenn das Formular abgeschickt wurde
    if( isset( $_POST['submit'] ) ) {
        
    $umaskold umask);
        
    // Falls die Datei groesser 0 Byte ist
        
    if( $_FILES['bild']['size'] > ) {
            
    // Datei verschieben und bei Misserfolg Fehler ausgeben
            
    if( !@move_uploaded_file$_FILES['bild']['tmp_name'], $_FILES['bild']['name'] ) ) {
                echo 
    'Konnte die Datei nicht kopieren!';
            } else {
                
    // Bildgroesse aendern (500px maximal Breite)
                
    BildScale$_FILES['bild']['name'], 100);

            }
            
    // CHMOD setzen damit man das Bild per FTP loeschen kann
            
    @chmod$_FILES['bild']['name'], 0755 );
            @
    chmod"t_" .$_FILES['bild']['name'], 0755 );
        }
        
    umask$umaskold );
    }

    ?>
    MFG, Alex

  • #2
    "geht aber nicht" ist keine ausreichende Fehlerbeschreibung!

    Bitte lies unsere sticky threads, brich dann den Code in deinem Beitrag entsprechend um, stell dein error_reporting() richtig ein und entferne die fehlerunterdrückenden @-Zeichen.

    Übrigens ist /gfx kein guter Ort. Kennst du den Unterschied zwischen absoluten und relativen Pfaden?

    Kommentar


    • #3
      ouh, sorry wenn ich's nicht ausreichend beschrieben habe;
      den unterschied zwischen absolut und relativ kenne ich, habs auch mit absoluten Pfad probiert, aber auch kein Ergebnis.

      Hab die Thread jetzt mal gelesen und per Error-Reporting was rausgeholt:

      Notice: Undefined index: bild in /home/www/web122/html/blacrew/testup.php on line 11

      Das Problem ist aber eher beiläufig, hab das jetzt erstmal so gelöst, das das Upload-Skript halt direkt in dem Bilder Ordner liegt...wesentlich wichtiger iss mit das korrekte Skalieren der Bilder
      Zuletzt geändert von xserio; 11.06.2008, 04:43.

      Kommentar


      • #4
        Es findet alles in der Funktion BildScale bis zum Aufruf von imagecopyresampled() statt. Die Variablen haben sehr sprechende Namen. Hast du mal selbst versucht, die Höhe auch noch zu beschränken? Wie sieht dein Ansatz aus, kannst du etwas Code zeigen?

        Kommentar


        • #5
          ok, wie gesagt, ich habe sehr wenig Ahnung von PHP, fang gerade erst an, mich mit der Materie zu beschäftigen...

          ich habe schon versucht das Selber zu lösen;

          PHP-Code:
          function BildScale$Grafikdatei$ThumbnailBreite$ThumbnailHoehe ) {

              
          $Bilddaten getimagesize$Grafikdatei );

              
          $OriginalBreite $Bilddaten[0];
              
          $OriginalHoehe $Bilddaten[1];

              if( 
          $OriginalBreite $ThumbnailBreite ) {
                  
          $ThumbnailBreite $OriginalBreite;
              }
              
          $Skalierungsfaktor $OriginalBreite/$ThumbnailBreite;
              
          $ThumbnailHoehe intval$OriginalHoehe/$Skalierungsfaktor );


              
          $Originalgrafik imagecreatefromjpeg$Grafikdatei );
              
          $Thumbnailgrafik imagecreatetruecolor$ThumbnailBreite$ThumbnailHoehe ); 
          ...
          PHP-Code:
                  if( !@move_uploaded_file$_FILES['bild']['tmp_name'], $_FILES['bild']['name'] ) ) {
                      echo 
          'Konnte die Datei nicht kopieren!';
                  } else {
                      
          // Bildgroesse aendern (500px maximal Breite)
                      
          BildScale$_FILES['bild']['name'], 100100); 
          mehr ist mir icht eingefallen... habe einfach oben in die Funktionsparameter $Thumbnailhoehe zugefügt und versucht den unten beim Funktionsaufrauf mit zu definieren (100). Aber da passiert garnichts, das Script arbeitet genau wie vorher...

          Ich denke hier:
          if( $OriginalBreite < $ThumbnailBreite ) {
          $ThumbnailBreite = $OriginalBreite;
          }
          $Skalierungsfaktor = $OriginalBreite/$ThumbnailBreite;
          $ThumbnailHoehe = intval( $OriginalHoehe/$Skalierungsfaktor );

          muss auch noch was passieren, oder nicht? Die Umrechnungen sind für mich aber so verwirrend, das ich icht weiss, was...

          Tut mir leid, wenn ich mich etwas laienhaft ausdrücke, aber wie gesagt, ich fang erst an...

          gruss, Alex

          Kommentar


          • #6
            Mal ne Frage: Ist der eingangs gepostete Code der Funktion komplett? Wenn ja dann dreh man dein error_reporting() hoch und lass dir PHP Fehler anzeigen. Ich wette auf Notices
            PHP-Code:
            //als allerste Zeile des Script
            <?php
            ini_set
            ('display_errors','1');
            error_reporting(E_ALL);
            //Rest deines Codes
            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


            • #7
              hi!

              ja, ich habe schon in einem Beitrag etwas weiter oben geschrieben, das es folgende Meldung gibt, wenn ich den Error-Report aktiviere:

              Notice: Undefined index: bild in /home/www/web122/html/blacrew/testup.php on line 11

              Das Upload-Problem habe ich inzwischen gelöst! Alles wird in den richtigen Ordner geladen. Ich war verwirrt, da mir das Script immer "konnte die Datei nicht kopieren" zurück gab, was aber an der if-schleife des Scripts und dem dazugehörigen Echo lag. Die Datei hat er trotzdem in das richtige Verzeichnis kopiert...

              Was jetzt noch bleibt ist das Problem mit der Bildhöhen-Skalierung, wobei ich einfach icht richtig durchsteige;

              $Skalierungsfaktor = $OriginalBreite/$ThumbnailBreite;
              $ThumbnailHoehe = intval( $OriginalHoehe/$Skalierungsfaktor );

              warum denn intval() bei Thumbnailhöhe?Habe mir die Funktion
              in der Doku mal angeschaut, die gibt ja nur den integer zurück,
              aber es wird doch eh nur mit Zahlen gearbeitet (?)
              Und warum wir die Originalbreite durch die Thumbnailbreite geteilt?
              damit erhalte ich doch nicht die maximal gewollte Größe
              (in meinem Fall 100px)

              einige Sachen, die ich hier noch nicht verstehe...

              gruss, Alex

              Kommentar


              • #8
                warum denn intval() bei Thumbnailhöhe?Habe mir die Funktion
                in der Doku mal angeschaut, die gibt ja nur den integer zurück,
                aber es wird doch eh nur mit Zahlen gearbeitet (?)
                Integer geteilt durch Integer ergibt nicht immer einen Integer. Darum intval(), denn das sind Pixelgrössen und die gibt's nur ganzzahlig
                Und warum wir die Originalbreite durch die Thumbnailbreite geteilt?
                damit erhalte ich doch nicht die maximal gewollte Größe
                Damit der Skalierungsfaktor herauskommt. Mit dem kannst du dann das Bild verkleinern ohne es zu verzerren sprich die Seitenverhältnisse bleiben erhalten.
                Du musst erstmal feststellen welche Seite die grössere ist (Höhe oder Breite). Diese setzt du dann 100, berechnest daraus und der jeweiligen Originallänge den Skalierungsfaktor. Mit dem Faktor kannst du dann die kürzere Seite des Thumbs berechnen
                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


                • #9
                  Es ist schon mal eine gute Idee gewesen, die gewünschte Höhe als zusätzlichen Funktionsparameter zu übergeben. Aber du musst in der Funktion den Code schon auch noch anpassen. Im Moment wird $ThumbnailHoehe ja noch wie zuvor mit einem Wert überschrieben.

                  Schreib dir doch erstmal die notwendige Mathematik/Logik auf ein Blatt Papier. Wenn du nicht drauf kommst, schau in den Usercomments zu imagecopyresampled().

                  Kommentar


                  • #10
                    Habs geschafft!
                    mit ner einfachen if-Abfrage, hab die Funktion einfach sozusagen nochmal genau so kopiert und Breite einfach mit Hoehe vertauscht...
                    Problem hab ichjetzt aber wieder mit dem Upload in den richtigen Ordner, dazu gleich mehr...
                    Zuletzt geändert von xserio; 11.06.2008, 21:14.

                    Kommentar


                    • #11
                      So... nachdem dann alles doch nicht so funktionier hatte (entweder ging der Upload ind bestimmtes Verzeichnis oder das Skalieren nicht richtig) hab ich die Funktion Bildscale mal in ein anderes Script eingebaut und auch endlich rausgefunden, wie ich die Höhe mit Skaliert bekomme. Das verschieben in den richtigen Ornder geht jetzt mit copy() (move_uploaded_file wollte in dem Script einfach nicht...)

                      Danke nochmal für die Hilfe hier, gerade was einige logische Sachen angeht... aber das am Anfang alles ziemlich verwirrend ^^ Werd eich bestimmt bald mit dem nächsten Problem nerven ;D

                      Für alle die's interessiert:
                      PHP-Code:
                      <?php
                      $tempname 
                      $_FILES['file']['tmp_name'];
                      $name $_FILES['file']['name'];


                      $type $_FILES['file']['type'];
                      $size $_FILES['file']['size'];

                      if(
                      $type != "image/gif" && $type != "image/jpeg") {
                          
                      $err[] = "nur gif und jpeg Dateien dürfen hochgeladen werden.";
                      }
                      if(
                      $size "1500000") {
                          
                      $err[] = "Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 1500 KB!";
                      }

                      if(empty(
                      $err)) {

                      /////////////// Bild auf neue Größe Skalieren ///////////////////////////////


                      function BildScale$Grafikdatei$ThumbnailBreite ) {

                          
                      $Bilddaten getimagesize$Grafikdatei );

                          
                      $OriginalBreite $Bilddaten[0];
                          
                      $OriginalHoehe $Bilddaten[1];
                          
                      $max_breite '800';
                          
                      $max_hoehe '600';
                              
                                 if(
                      $OriginalBreite $OriginalHoehe)
                                    {
                                      
                      $ThumbnailBreite $max_breite;
                                      
                      $ThumbnailHoehe = ($OriginalHoehe/($OriginalBreite/$ThumbnailBreite));
                                    }
                                    else
                                      {
                                        
                      $ThumbnailHoehe $max_hoehe;
                                        
                      $ThumbnailBreite = ($OriginalBreite/($OriginalHoehe/$ThumbnailHoehe));
                                      }
                            


                          
                      $Originalgrafik imagecreatefromjpeg$Grafikdatei );
                          
                      $Thumbnailgrafik imagecreatetruecolor$ThumbnailBreite$ThumbnailHoehe );
                          
                      imagecopyresampled$Thumbnailgrafik$Originalgrafik0000$ThumbnailBreite$ThumbnailHoehe$OriginalBreite$OriginalHoehe );
                          
                      imagejpeg$Thumbnailgrafik$Grafikdatei90 );

                          
                      imagedestroy$Originalgrafik );
                          
                      imagedestroy$Thumbnailgrafik );
                      }

                      /////////////////////////////////////////////////////////////////////////////////

                          
                      BildScale("$tempname"800600 );
                          
                      copy("$tempname""gfx/$name");   // Zielordner angeben!
                       
                          
                      echo "Die Datei $name wurde erfolgreich hochgeladen!";
                      }
                      else {
                          foreach(
                      $err as $error)
                          echo 
                      "$error<br>";
                      }
                      ?>

                      Kommentar

                      Lädt...
                      X