Bilderupload klappt nicht

Antwort erstellen

Bestätigungscode
Gib den Code genau so ein, wie du ihn siehst; Groß- und Kleinschreibung wird nicht unterschieden.
Smileys
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :| :mrgreen: :geek: :ugeek:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[url] ist eingeschaltet
Smileys sind eingeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Bilderupload klappt nicht

Re: Bilderupload klappt nicht

von PCFreak » Fr 29. Jun 2018, 11:07

Hallo Stefan,

perfekt gelöst, funktioniert! - Danke für das schnelle Updaten.

Gruß

Peter

Re: Bilderupload klappt nicht

von pichel » Fr 22. Jun 2018, 22:57

Hallo Peter,

ich habe mir meinen Code nun mal in Ruhe angeschaut. Also die Abfrage auf größer $maxDim hatte ich eingebaut, um ein Hochskalieren zu vermeiden - und dann vergessen, im anderen Fall auch das unskalierte Bild zurückzugeben. Das sind so typische Fehler, die bei der Programmierung in C# oder Java schon durch die IDE abgefangen worden wäre...

Aber ich bin gerade zum dem Schluss gekommen, dass ein Hochskalieren sinnvoll ist und habe nun die Abfrage komplett rausgenommen.

Vielen Dank für deinen Änderungsvorschlag. Allerdings möchte ich ungern auf (== 1) vergleichen, da ein Gleichheits-Vergleich von float-Werten aufgrund der internen Speicherung nur manchmal funktionieren kann. Die beiden Zweige für "ratio >1" und dem else-Zweig (ratio <= 1) reichen meiner Meinung nach aus.

Ich werde heute oder morgen eine korrigierte Version 1.5.10 veröffentlichen.

Danke nochmal für deine Mitarbeit!

Gruß,

Stefan

Re: Bilderupload klappt nicht

von PCFreak » Mi 20. Jun 2018, 11:20

Hallo Stefan,

:!: DANKESCHÖN für deine Zeit und für die tolle Software! :!:

Du kannst sicherlich meine if-Abfragen noch etwas optimieren (Stichwort: elseif) :lol:

Gruß

Peter

Re: Bilderupload klappt nicht

von pichel » Di 19. Jun 2018, 20:08

Hallo Peter,

vielen Dank, dass du für das Problem auch gleich die Lösung präsentiert hast!! :)

Es stimmt schon, dass ich in meinen Tests wahrscheinlich immer Bilder mit einer Größe über 300 Pixel verwendet habe. Ich schaue mir deinen Lösungsweg noch genauer an, wenn ich die Zeit habe, mich damit in Ruhe zu befassen. Und in der nächsten Version ist es dann gefixt.

Aber für jetzt hast du ja eine Lösung gefunden, der offizielle Bugfix ist also nicht so ganz dringend.

Ach ja, im Zusammenhang mit Produktbildern ist mir ein anderer Fehler bekannt. Wenn man ein ganzes Set von Bildern importiert, kann das die Zuordnung bereits bestehender Bildzuordnungen durcheinanderbringen. Ist auch etwas, was ich in einer der nächsten Versionen fixen sollte.

Gruß,

Stefan

Re: Bilderupload klappt nicht

von PCFreak » Di 19. Jun 2018, 17:09

Final change product.php

Code: Alles auswählen

...
...
        private static function scaleImg($fn,$maxDim) {
                list($width, $height, $type, $attr) = getimagesize($_FILES['imagefile']['tmp_name']);
                        $size = getimagesize($fn);
                        $ratio = $size[0] / $size[1]; // width/height


                        if ($ratio = 1) {           // width/height = 1
                                $width = $maxDim;   // leave width
                                $height = $maxDim;  // leave height
                        }
                        if ($ratio > 1) {                   // width/heigth > 1
                                $width = $maxDim;           // leave width
                                $height = $maxDim / $ratio; // calculate new height
                        }
                        if ($ratio < 1) {                   // width/height < 1
                                $width = $maxDim * $ratio;  // calculate new width
                                $height = $maxDim;          // leave height
                        }

                        $src = imagecreatefromstring(file_get_contents($fn));
                        $dst = imagecreatetruecolor($width, $height);
                        imagealphablending($dst, false);
                        imagesavealpha($dst, true);
                        $transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127);
                        imagefilledrectangle($dst, 0, 0, $width, $height, $transparent);

                        imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
                        imagedestroy($src);
                        ob_start();
                        imagepng($dst); // adjust format as needed
                        $imagedata = ob_get_contents();
                        ob_end_clean();
                        imagedestroy($dst);
                        return $imagedata;
        }
...
...

Re: Bilderupload klappt nicht

von PCFreak » Di 19. Jun 2018, 11:47

Hallo Stefan,

wie wäre folgender Fix?

ORIGINAL

Code: Alles auswählen

        private static function scaleImg($fn,$maxDim) {
                list($width, $height, $type, $attr) = getimagesize($_FILES['imagefile']['tmp_name']);
                if ($width > $maxDim || $height > $maxDim) {
                        $size = getimagesize($fn);
                        $ratio = $size[0] / $size[1]; // width/height
                        if ($ratio > 1) {
                                $width = $maxDim;
                                $height = $maxDim / $ratio;
                        } else {
                                $width = $maxDim * $ratio;
                                $height = $maxDim;
                        }
                        $src = imagecreatefromstring(file_get_contents($fn));
                        $dst = imagecreatetruecolor($width, $height);
                        imagealphablending($dst, false);
                        imagesavealpha($dst, true);
                        $transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127);
                        imagefilledrectangle($dst, 0, 0, $width, $height, $transparent);

                        imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
                        imagedestroy($src);
                        ob_start();
                        imagepng($dst); // adjust format as needed
                        $imagedata = ob_get_contents();
                        ob_end_clean();
                        imagedestroy($dst);
                        return $imagedata;
                }
        }
FIXED ? - Abfrage auf Größe entfernt, Bedingung für ratio <1 eingebaut.

Code: Alles auswählen

        private static function scaleImg($fn,$maxDim) {
                list($width, $height, $type, $attr) = getimagesize($_FILES['imagefile']['tmp_name']);
                        $size = getimagesize($fn);
                        $ratio = $size[0] / $size[1]; // width/height
                        if ($ratio > 1) {
                                $width = $maxDim;
                                $height = $maxDim / $ratio;
                        }
                        if ($ratio < 1) {
                                $width = $maxDim * $ratio;
                                $height = $maxDim;
                        }
                        $src = imagecreatefromstring(file_get_contents($fn));
                        $dst = imagecreatetruecolor($width, $height);
                        imagealphablending($dst, false);
                        imagesavealpha($dst, true);
                        $transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127);
                        imagefilledrectangle($dst, 0, 0, $width, $height, $transparent);

                        imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
                        imagedestroy($src);
                        ob_start();
                        imagepng($dst); // adjust format as needed
                        $imagedata = ob_get_contents();
                        ob_end_clean();
                        imagedestroy($dst);
                        return $imagedata;
        }
DIFF

Code: Alles auswählen

diff products.php products.org
1311a1312
>               if ($width > $maxDim || $height > $maxDim) {
1317,1318c1318
<                       }
<                       if ($ratio < 1) {
---
>                       } else {
1336a1337
>
Hab es momentan nur mit quadratischen Bildern getestet, ggf. muss noch ein wenig dazuprogrammiert werden, wie gesagt, dafür "spreche" ich zu wenig PHP.

Gruß

Peter

Re: Bilderupload klappt nicht

von PCFreak » Di 19. Jun 2018, 11:22

Hallo Stefan,

Fehler vmtl. gefunden:

Code: Alles auswählen

        private static function scaleImg($fn,$maxDim) {
                list($width, $height, $type, $attr) = getimagesize($_FILES['imagefile']['tmp_name']);
                // if ($width > $maxDim || $height > $maxDim) {
                if ($width > $maxDim || $height > $maxDim || 1 == 1) {
                        $size = getimagesize($fn);
                        $ratio = $size[0] / $size[1]; // width/height
                        if ($ratio > 1) {
                                $width = $maxDim;
                                $height = $maxDim / $ratio;
                        } else {
                                $width = $maxDim * $ratio;
                                $height = $maxDim;
                        }
                        $src = imagecreatefromstring(file_get_contents($fn));
                        $dst = imagecreatetruecolor($width, $height);
                        imagealphablending($dst, false);
                        imagesavealpha($dst, true);
                        $transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127);
                        imagefilledrectangle($dst, 0, 0, $width, $height, $transparent);

                        imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
                        imagedestroy($src);
                        ob_start();
                        imagepng($dst); // adjust format as needed
                        $imagedata = ob_get_contents();
                        ob_end_clean();
                        imagedestroy($dst);
                        return $imagedata;
                }
        }
Ich habe einfach mal die Bedingung deaktiviert, die macht ja eh keinen Sinn oder?

Code: Alles auswählen

                if ($width > $maxDim || $height > $maxDim || 1 == 1) {
Und siehe da, es klappt. Ich sehe nun das Bild in der Bildzuweisung, allerdings natürlich hochskaliert auf 300px, aber so klappts.

Es müsste meiner Meinung nach entweder die Bedingung komplett raus oder dann halt das Bild in der Originalgröße eingefügt werden, wenn es kleiner ist als $maxDim.

Gruß

Peter

Re: Bilderupload klappt nicht

von PCFreak » Di 19. Jun 2018, 11:02

Hallo Stefan,

Problem vmtl. weiter eingegrenzt.

In Zeile 1374 der products.php steht

Code: Alles auswählen


                $fn = $_FILES['imagefile']['tmp_name'];

                $imageh = self::scaleImg($fn, 300);
                $imageBaseh_64 = base64_encode($imageh);

                $imagem = self::scaleImg($fn, 150);
                $imageBasem_64 = base64_encode($imagem);

                $imagel = self::scaleImg($fn, 80);
                $imageBasel_64 = base64_encode($imagel);

                $pdo->beginTransaction();
Lädt man ein Bild hoch mit 400x400 pixel (png), wird dieses angezeigt. Probiert man ein Bild mit 100x100 (png), fehlt die Vorschau bei der Bildzuweisung aber das Bild funktioniert ansonsten im Rest von ordersprinter.

Meine Vermutung ist nun, dass

Code: Alles auswählen

                $imageh = self::scaleImg($fn, 300);
und u.U. auch die anderen scaleImg Aufrufe "in die Hose gehen", wenn das Bild nicht mindestens die Ausmaße hat, die mit scaleImg abgedeckt werden, deshalb wird auch wenn das Bild nur 100x100 ist, kein $imageh erstellt, bei 400x400 schon.
Würde heißen, dass hochgeladene Bilder mindestens größer als 300px sein müssten.

Die Routine, die da mit reinspielt (Zeile 1338 und folgende) ist vmtl:

Code: Alles auswählen

private static function scaleImg($fn,$maxDim) {
                list($width, $height, $type, $attr) = getimagesize($_FILES['imagefile']['tmp_name']);
                if ($width > $maxDim || $height > $maxDim) {
                        $size = getimagesize($fn);
                        $ratio = $size[0] / $size[1]; // width/height
                        if ($ratio > 1) {
                                $width = $maxDim;
                                $height = $maxDim / $ratio;
                        } else {
                                $width = $maxDim * $ratio;
                                $height = $maxDim;
                        }
                        $src = imagecreatefromstring(file_get_contents($fn));
                        $dst = imagecreatetruecolor($width, $height);
                        imagealphablending($dst, false);
                        imagesavealpha($dst, true);
                        $transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127);
                        imagefilledrectangle($dst, 0, 0, $width, $height, $transparent);

                        imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
                        imagedestroy($src);
                        ob_start();
                        imagepng($dst); // adjust format as needed
                        $imagedata = ob_get_contents();
                        ob_end_clean();
                        imagedestroy($dst);
                        return $imagedata;
                }
        }
Leider kann ich kein PHP.

Was denkst du, bin ich auf der richtigen Spur?

Gruß

Peter

Re: Bilderupload klappt nicht

von PCFreak » Di 19. Jun 2018, 10:29

Hallo Stefan,

sorry für die vielen Posts aber ich untersuche das Problem immer wieder mal so nebenbei.

Vielleicht kannst du dazu was sagen:

Code: Alles auswählen

[NOT OK] https://domain.tld/php/contenthandler.php?module=products&command=getprodimage&prodid=61&size=h
[OK]	 https://domain.tld/php/contenthandler.php?module=products&command=getprodimage&prodid=61&size=m
[OK]	 https://domain.tld/php/contenthandler.php?module=products&command=getprodimage&prodid=61&size=l

[OK]	 https://domain.tld/php/contenthandler.php?module=products&command=getprodimage&prodid=60&size=h
[OK]	 https://domain.tld/php/contenthandler.php?module=products&command=getprodimage&prodid=60&size=m
[OK]	 https://domain.tld/php/contenthandler.php?module=products&command=getprodimage&prodid=60&size=l
Es scheint so, dass für das Bild mit der ID 61 kein Image mit size h existiert.

In der Seite für die Bildzuweisung werden die Bilder ja mit ungefähr folgendem HTML-Code angezeigt:

Code: Alles auswählen

https://domain.tld/php/contenthandler.php?module=products&command=getprodimage&prodid=61&millis=1529390739639
hänge ich hier ein &size=m an, erhalte ich das Bild, mit &size=h nicht, was dem Fehlerbild entspricht.

Könnte es sein, dass die Upload-Routine hier was falsch gemacht hat und keinen Eintrag für imgh erstellt hat?


Wenn ich imgh manuell in die DB schreibe (einfach das gleich was unter imgl stand), wird das Bild in der Bildzuweisung angzeigt.


Rein logisch betrachtet vermute ich, dass beim Upload der Eintrag imgh nicht erstellt wurde - warum auch immer.

Gruß

Peter

Re: Bilderupload klappt nicht

von PCFreak » Di 19. Jun 2018, 08:29

Hallo Stefan,

noch eine Erkenntnis. Bei all meinen selbst hochgeladenen Bildern ist das Feld imgh in der Tabelle ordersprinter_prodimages im Gegensatz zu den Beispielbildern leer.

Code: Alles auswählen

mysql> show columns from ordersprinter_prodimages;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| keyname | varchar(30) | YES  |     | NULL    |                |
| imgh    | mediumblob  | YES  |     | NULL    |                |
| imgm    | mediumblob  | YES  |     | NULL    |                |
| imgl    | mediumblob  | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+

Code: Alles auswählen

mysql> select imgh from ordersprinter_prodimages where keyname = 'test';
+------+
| imgh |
+------+
|      |
+------+
1 row in set (0.00 sec)

Code: Alles auswählen

mysql> select imgh from ordersprinter_prodimages where keyname = 'Funky Cold Medina';
+------+
| imgh |
+------+
|      |
+------+
1 row in set (0.00 sec)
Und noch eine Korrektur. Meine 2. Installation ist nicht wie geschrieben CentOS, sondern Ubuntu LAMP on 16.04.

Könnte der leere Eintrag für imgh das Problem sein und wenn ja, warum ist er leer?

Gruß

Peter

Nach oben