• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Fehler bei bestimmten Bildern - getimagesize()

fiedel

Mitglied
Hallo zusammen,

in meinem Uploadscript werden bei manchen Bildern die Dateitypen erkannt und bei manchen nicht. Das verblüffende ist, dass es sich bei allen Bildern auch noch um die gleiche Endung .JPG (großgeschrieben) handelt. Der einzige Unterschied ist, dass sie von verschiedenen Kamaras aufgenommen wurden.

Codeausschnitt:
PHP:
// $imginfo vorher mit "getimagesize()" definiert

if($imginfo[2] == 2) {
   $src = imagecreatefromjpeg('i/' .$name);
   $typeausgabe = '.jpg';
} elseif($imginfo[2] == 3) {
   $src = imagecreatefrompng('i/' .$name);
   $typeausgabe = '.png';
} elseif($imginfo[2] == 1) {
   $src = imagecreatefromgif('i/' . $name);
   $typeausgabe = '.gif';
} else {
   print '<p>Dateityp wird nicht unterst&uuml;tzt.</p>';
   @unlink($name); // Falls Dateityp nicht unterstützt wird, wird die Datei wieder gelöscht
   unset($src);
   exit;                
}
Ich verstehs einfach nicht, wie sowas gehen soll.

Das Script stammt von dieser Seite: somegas.de – So'n Krams halt » IMGhost

Gruß,
fiedel
 
Werbung:
Was genau hast du denn vor und wo? Bei einem Dateiupload zb verwende diesen Workaround zum Prüfen von Bildern:
PHP:
eregi('image/', $_FILES['uploadform']['type'])
Beispiel:
PHP:
if(!eregi('image/', $_FILES['uploadform']['type'])) { 
 echo "<p>Fehler: Datei ist kein Bild</p>";
 } else {
 ## hier wenn der Type ein Bild ist zb:
$bild = getimagesize(BILD);
 if($bild['mime'] == 'image/png') { 
 ## png
 } elseif($bild['mime'] == 'image/jpeg') { 
 ## jpg
 } elseif($bild['mime'] == 'image/gif') {
 ## gif
 } 
# etc ...

}
Ich hoffe, ich konnte dir ein bisschen Einblick verschaffen.

Mfg
 
zb verwende diesen Workaround zum Prüfen von Bildern:
PHP-Code:
eregi('image/', $_FILES['uploadform']['type'])
Nunja ich möchte wirklich nicht rumkritisieren, ich bin mir relativ sicher, dass die eregi-Funktion zum alten Eisen gehört. Meines Wissens ist preg_match hier die richtige Wahl.

Außerdem ist der MIME-Type der Datei wahrscheinlich nicht aussagekräftig genug. Da er hier nur als "Vorfilter" genutzt wird, kann man es aber trotzdem so stehen lassen.

Die getimagesize-Funktion ist schon die richtige Wahl und ich gehe auch davon aus, dass der Fehler eher in imagecreatefromjpeg entsteht oder einfach dadurch, dass die Datei nicht vorhanden ist bzw. falsch kopiert wird.

Deshalb würde ich erstmal folgende Sachen prüfen:

- Kann man das Bild lokal öffnen und anzeigen?
- Wird die Datei überhaupt ins PHP-Temp-Verzeichnis hochgeladen, oder ist die Datei eventuell zu groß?
- Wird die Datei nach dem Upload richtig verschoben / kopiert?
 
Werbung:
Danke für eure Antworten!

Die getimagesize-Funktion ist schon die richtige Wahl und ich gehe auch davon aus, dass der Fehler eher in imagecreatefromjpeg entsteht oder einfach dadurch, dass die Datei nicht vorhanden ist bzw. falsch kopiert wird.

Deshalb würde ich erstmal folgende Sachen prüfen:

- Kann man das Bild lokal öffnen und anzeigen?
ja, alle Bilder lassen sich lokal problemlos öffnen

- Wird die Datei überhaupt ins PHP-Temp-Verzeichnis hochgeladen, oder ist die Datei eventuell zu groß?
sorry, was ist ein Temp-Verzeichnis? :oops: (Google und Wikipedia konnten es mir leider nicht erklären) Laut PHP-Skript wäre die Datei nicht zu groß, meinst du es könnte da vom Webspaceanbieter her eine Sperre vorliegen?

- Wird die Datei nach dem Upload richtig verschoben / kopiert?
das weiß ich nicht. Wie finde ich das heraus?

Gruß,
fiedel
 
Werbung:
Hallo,

was steht denn in $imginfo[2], wenn nicht 2 ?

Hilft dir vielleicht
PHP:
ini_set('gd.jpeg_ignore_warning', 1);

$types = array (1 => 'gif', 'jpeg', 'png');

$imagedata = getimagesize($image);

if ($imagedata[2]) {
  $tmp_image = @call_user_func('imagecreatefrom' . $types[$imagedata[2]], $image);
}
weiter?
 
Hi,

also $image dürfte bei dir
Code:
$image = 'i/' . $name;
entsprechen.

$tmp_image entspricht in deinem Code $src:
PHP:
ini_set('gd.jpeg_ignore_warning', 1);

$types = array (1 => 'gif', 'jpeg', 'png');

$image = 'i/' . $image;
$imagedata = getimagesize($image);

// wenn $imagedata[2] nicht 0 enthält
if ($imagedata[2]) {
  $src = @call_user_func('imagecreatefrom' . $types[$imagedata[2]], $image);
  $typeausgabe = '.' . $types[$imagedata[2]];
}

Ich hoffe ich habe alles richtig angepasst. Das müsstest du jetzt anstelle deines oben geposteten Codes verwenden.

Was gibt denn
Code:
var_dump( $imginfo[2] );

in deinem aktuellen Code aus?
 
Werbung:
Danke für's anpassen! (hast beim nochmal abschreiben nur vergessen, $image in $name abzuändern) ;)

PHP:
ini_set('gd.jpeg_ignore_warning', 1);

$types = array (1 => 'gif', 'jpeg', 'png');

$image = 'i/' . $name; // muss $name heißen ^^
$imagedata = getimagesize($image);

// wenn $imagedata[2] nicht 0 enthält
if ($imagedata[2]) {
   $src = @call_user_func('imagecreatefrom' . $types[$imagedata[2]], $image);
   $typeausgabe = '.' . $types[$imagedata[2]];
}  
            
var_dump( $imginfo[2] );
Habe jetzt mit diesem Code zwei Versuche gestartet:

1. Mit der einen (funktionierenden) JPEG-Grafik (1.24 MB; 2304 x 1728 ):
Warning: ini_set() has been disabled for security reasons in /var/kunden/webs/web2430/crazzysub/imghost.php on line 95
int(2)
2. Mit der anderen JPEG-Grafik (2.57 MB; 2816 x 2112):
Warning: ini_set() has been disabled for security reasons in /var/kunden/webs/web2430/crazzysub/imghost.php on line 95

Warning: getimagesize(i/52ddeac40506.JPG) [function.getimagesize]: failed to open stream: No such file or directory in /var/kunden/webs/web2430/crazzysub/imghost.php on line 100
NULL
Warning: Division by zero in /var/kunden/webs/web2430/crazzysub/imghost.php on line 112

Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in /var/kunden/webs/web2430/crazzysub/imghost.php on line 126

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /var/kunden/webs/web2430/crazzysub/imghost.php on line 127

Warning: chmod() [function.chmod]: No such file or directory in /var/kunden/webs/web2430/crazzysub/imghost.php on line 138

Warning: chmod() [function.chmod]: No such file or directory in /var/kunden/webs/web2430/crazzysub/imghost.php on line 139
Meinst du, es könnte an den Abmessungen oder der Größe liegen?

Gruß,
fiedel
 
2. Mit der anderen JPEG-Grafik (2.57 MB; 2816 x 2112):
[...]
Meinst du, es könnte an den Abmessungen oder der Größe liegen?
Da bin ich mir ziehmlich sicher. Laut Standarteinstellung in der php.ini ist die Uploadgröße auf 2MB beschränkt.

Mfg

Edit:
Relevante Einstellungen: upload_max_filesize (2MB Standart) und max_execution_time (30 sek Standart)
 
Zuletzt bearbeitet:
Werbung:
ini_set solltest du aufgrund der Fehlermeldung entfernen oder auskommentieren!
das wollte ich sowieso machen, habe es nur innen gelassen, da ich nicht wusste, ob das von Relevanz ist!

Da bin ich mir ziehmlich sicher. Laut Standarteinstellung in der php.ini ist die Uploadgröße auf 2MB beschränkt.

Mfg

Edit:
Relevante Einstellungen: upload_max_filesize (2MB Standart) und max_execution_time (30 sek Standart)
Super! Das muss einem erstmal gesagt werden! :mrgreen: Wenn ich das richtig verstanden habe, kann ich also einfach...
PHP:
upload_max_filesize('3M');
max_execution_time('50');
...schreiben?

EDIT: Offenbar nicht! ^^ Wie mache ich das dann?
 
Super! Das muss einem erstmal gesagt werden! :mrgreen: Wenn ich das richtig verstanden habe, kann ich also einfach...
PHP-Code:
upload_max_filesize('3M');
max_execution_time('50');

...schreiben?
Es sind keine Funktionen. Entweder per ini_set oder .htaccess, Beispiel .htaccess:
Code:
php_flag upload_max_filesize 3M
Beispiel ini_set:
PHP:
ini_set('upload_max_filesize', '3M');
Mfg
 
Boa, tausend Dank!!
Mit ini_set gehts zwar nicht (hat ja vorhin die Warnung gezeigt), aber das mit der .htaccess-Datei funktioniert einwandfrei!
 
Werbung:
Zurück
Oben