Konstantin Matern: Upload + Bildverkleinerung + leere Seite

Bin irgendwie langsam am verzweifeln...
Hab ein Script, das mir Bilder verkleinern soll. Das klappt auch wunderbar solange die Bilder keine große Auflösung haben.

Also kurz:
Bild1 800x600, 680kB, JPG      -> klappt wunderbar!
Bild2 2500x1875, 600kb!!!, JPG -> klappt nicht!

Local geht es mit beiden Dateien....

Das soll mir mal einer erklären...

php.ini-werte:
upload_max_filesize 20M
max_execution_time 30
max_input_time  60
memory_limit         16M
post_max_size         8M

das wichtigste des Scriptes:

  
  
  $move = move_uploaded_file($_FILES['foto']['tmp_name'], $uploaddir . $foto_name . '.jpg');  
  
  
  //Fotogröße  
  $bildpfad = $uploaddir . $foto_name .   '.jpg';  
  
  $size = GetImageSize($bildpfad);  
  $width = $size["0"];  
  $height = $size["1"];  
  
  //0.75 muss mindestens sein  
  $teil = round($width/$height,3);  
  if($teil<0.75) {  
   //dieser Teil muss oben abgeschnitten werden  
   $var    = $width/240;  
   $h_fertig_bild  = 320*$var;  
   $y_abschnitt  = round(($height-$h_fertig_bild)/2,0);  
  
  }  
  else {  
   $y_abschnitt="0";  
   $h_fertig_bild = $height;  
  }  
  
  //Hochladen des Bildes  
  if($width>=240 AND $height>=320) {  
   //$foto = htmlspecialchars($foto);  
  
   $diff = round(($height-2*$y_abschnitt)/320,1);  
   $twidth = round($width/$diff,0);  
   $theight = 320;  
   $image_p = imagecreatetruecolor($twidth, $theight);  
   $image = ImageCreateFromJpeg($bildpfad);  
  
   imagecopyResampled ($image_p,$image,0,0,0,$y_abschnitt,$twidth,$theight,$width,$h_fertig_bild);  
   ImageJpeg($image_p,$bildpfad,100);  

Folgendes habe ich beobachtet:
Bei dem versuch wo es nicht klappt lädt die seite mit dem Forumular solange bis im Tempordner des Servers, die Datei so bei 580 kB ist, dann befindet sie sich im uploadordner und die Forumularseite zeigt fertig an ...keine Weiterleitung auf die nächste Seite.

  1. Hi Konstantin,

    memory_limit 16M

    Ich vermute, dass das hier nicht ausreicht - du musst nämlich bedenken, dass das Bild für den Bearbeitugnsvorgang intern von PHP ganz anders im Arbeitsspeicher abgelegt wird als es in der Original .gif/.jpg/.png Datei abgelegt ist. AFAIK braucht dies deutlich mehr Speicherplatz.

    Spuckt PHP dir denn gar keine Fehlermeldung aus? Error-Reporting auf E_ALL gesetzt?

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Patch zur Verwendung von PATHINFO in JLog
    Denn wer 'ne Blacklist hat, muss halt daran denken, dass er manches nicht sieht... und vor dem posten die Realitaet einschalten. (Swen Wacker)
    1. Hi Konstantin,

      memory_limit 16M

      Ich vermute, dass das hier nicht ausreicht - du musst nämlich bedenken, dass das Bild für den Bearbeitugnsvorgang intern von PHP ganz anders im Arbeitsspeicher abgelegt wird als es in der Original .gif/.jpg/.png Datei abgelegt ist. AFAIK braucht dies deutlich mehr Speicherplatz.

      Spuckt PHP dir denn gar keine Fehlermeldung aus? Error-Reporting auf E_ALL gesetzt?

      MfG, Dennis.

      Danke für die schnellen Antworten.

      Error_reporting habe ich bereits auf E-All testweise gesetzt...keine Fehlermeldung, wie geschrieben wird halt die Seite die im action-tag des Formulars steht garnicht erst aufgerufen. Sondern er auf der seite wo das Forumular ist irgendwann hängen bleibt.

      Ich setze mal local memory_limit auf 16M mal sehen was sich ergibt...dürfte mit dem selben Bild ja auch nicht gehen.

      1. Ich setze mal lokal memory_limit auf 16M mal sehen was sich ergibt...dürfte mit dem selben Bild ja auch nicht gehen.

        stand ja schon standartmäßig auf 16 M. Dann dürfte es doch auf dem Server auch nicht daran leigen, weil lokal geht das ja mit Bild?!?!??

        1. Weiß jemand vielleicht wie ich das sonst lösen kann? Glaube nicht, dass der Provider mir den Memory-wert erhöhen wird... wobei das nicht mal daran liegt...sieht zumidnest so aus.

          1. Hi Konstantin,

            Weiß jemand vielleicht wie ich das sonst lösen kann? Glaube nicht, dass der Provider mir den Memory-wert erhöhen wird... wobei das nicht mal daran liegt...sieht zumidnest so aus.

            Wenn dir das Memory-Limit nicht erhöht wird, wird dir nichts anderes übrgib bleiben, als das Bild auf deinem PC mit $BILDBEARBEITUNGSPROGRAMM zu verkleinern und anschließend erst hochzuladen - mit getimagesize() kannst du vor dem Verarbeiten prüfen, ob das Bild nicht zu groß ist, damit der Fehler nicht auftritt - du kannst stattdessen dann eine Fehlermeldung anzeigen lassen.

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Patch zur Verwendung von PATHINFO in JLog
            Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)
            1. Hi Konstantin,

              Weiß jemand vielleicht wie ich das sonst lösen kann? Glaube nicht, dass der Provider mir den Memory-wert erhöhen wird... wobei das nicht mal daran liegt...sieht zumidnest so aus.

              Wenn dir das Memory-Limit nicht erhöht wird, wird dir nichts anderes übrgib bleiben, als das Bild auf deinem PC mit $BILDBEARBEITUNGSPROGRAMM zu verkleinern und anschließend erst hochzuladen - mit getimagesize() kannst du vor dem Verarbeiten prüfen, ob das Bild nicht zu groß ist, damit der Fehler nicht auftritt - du kannst stattdessen dann eine Fehlermeldung anzeigen lassen.

              MfG, Dennis.

              Für mich wäre es ja kein Problem ein Bild zu verkleinern und hochzuladen, was ich generell mache... Leider kann das nicht jeder Besucher der Seite.

              Gibt es keine Grafikfunktion die schonender mit dem Momoriylimit umgeht?

              PS: Ich glaub einfach nicht das das am memorylimit liegt, weil ichd as lokal auch auf 16M habe und da geht es mit jedem Bild...

  2. Huhu

    Hab ein Script, das mir Bilder verkleinern soll. Das klappt auch wunderbar solange die Bilder keine große Auflösung haben.

    Bild1 800x600, 680kB, JPG      -> klappt wunderbar!
    Bild2 2500x1875, 600kb!!!, JPG -> klappt nicht!

    Relevant ist die unkomprimierte Dateigröße, denn zum Verkleinern muss das Bild
     erst ausgepackt werden.
    Vermutlich wird beim zweiten Bild das Memory-Limit überschritten.

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Moin,

      Bild1 800x600, 680kB, JPG      -> klappt wunderbar!
      Bild2 2500x1875, 600kb!!!, JPG -> klappt nicht!

      Relevant ist die unkomprimierte Dateigröße, denn zum Verkleinern muss das Bild erst ausgepackt werden.

      Richtig.

      Vermutlich wird beim zweiten Bild das Memory-Limit überschritten.

      Nicht nur vermutlich, sondern nahezu sicher.
      Beim ersten Bild komme ich unkomprimiert auf einen Speicherbedarf von
        800 *  600 * 3 =  1440000 Bytes
      beim zweiten auf
       2500 * 1875 * 3 = 14062500 Bytes

      Im zweiten Fall sind wir also schon relativ dicht an der Grenze von 16MB. Bedenkt man jetzt noch, dass PHP auch noch Speicherplatz für das neu erzeugte verkleinerte Bild braucht (und das ist, wenn ich das Script einigermaßen verstehe, auch noch mal ungefähr ein halbes MB), und noch etwas für Scriptvariablen und so'n Zeugs, dann kann ich mir schon vorstellen, dass die 16MB-Grenze dabei gesprengt wird.
      Dass es beim OP lokal mit 16MB gerade noch geht und beim Hoster nicht, könnte an Unterschieden in der PHP-Version und Konfiguration liegen. Wenn es so knapp hergeht, können auch kleine Unterschiede schon entscheidend sein.

      So long,
       Martin

      --
      Mir geht es gut. Ich mag die kleinen Pillen, die sie mir dauernd geben.
      Aber warum bin ich ans Bett gefesselt?