getimagesize() als Kontrolle ob JPG fertig geladen ist?
Martin aus Wien
- php
In ein Verzeichnis werden laufend per FTP Bilder hochgeladen. Der folgende Code soll Bilder, die noch nicht verkleinert sind, verkleinern, den Dateinamen mit einem vorgesetzten "new_" versehen und speichern. Er wird alle 1 sec per XMLHttpRequest aufgerufen. Es dürfen aber natürlich nur Bilder verkleinert werden, die schon vollständig hochgeladen sind. Mit getimagesize() wollte ich feststellen, ob der File ein gültiges JPG ist, aber das scheint nicht zu klappen. Immer wieder kriege ich zwischendurch Bilder, die schwarz sind, die erwarteten Maße haben, aber eine viel zu kleine Dateigröße, die also anscheinend vom Code bearbeitet worden sind, bevor sie noch ganz da waren. Es sieht so aus, als ob nur das Ergebnis von imagecreatetruecolor() gespeichert wird, aber imagecreatefromjpeg() fehlgeschlagen ist.
if ($dh = opendir($dir)) {
while (false !== ($file = readdir($dh))) {
if (eregi(".jpg$",$file) && !eregi("^new_",$file) && !is_file($dir."/new_".$file)) {
if(getimagesize($dir."/".$file) != FALSE){
$image = $dir."/".$file;
list($oldwidth,$oldheight) = getimagesize($image);
if($oldwidth > 320 || $oldheight > 242){
if($oldwidth > $oldheight){
$newwidth = 320;
$newheight = $oldheight/$oldwidth*320;
}
else{
$newheight = 242;
$newwidth = $oldwidth/$oldheight*242;
}
$resized = imagecreatetruecolor($newwidth,$newheight) ;
$source = imagecreatefromjpeg($image) ;
imagecopyresampled($resized,$source,0,0,0,0,$newwidth,$newheight,$oldwidth,$oldheight);
imagejpeg($resized,$dir."/"."new_".$file);
imagedestroy($resized);
imagedestroy($source);
}
}
}
}
}
Wie kann ich sicherstellen, dass die Bilder erst bearbeitet werden, wenn sie vollständig hochgeladen sind?
Gruß und Dank
Martin
Hallo,
Wie kann ich sicherstellen, dass die Bilder erst bearbeitet werden, wenn sie vollständig hochgeladen sind?
Meine Idee wäre sich die Dateigröße der infragekommenden Kandidaten zu merken und beim nächsten Durchlauf dieses Scripts zu schauen ob die sich verändert hat. Ich weiß aber nicht ob es noch eine einfachere Möglichkeit gibt.
p.s.: Generell zum Bilderverkleinern kann ich dir diese Klasse empfehlen.
Warum sagt mir denn keiner, dass ich mir die Antwort schon selber gegeben habe?
Wenn imagecreatefromtruecolor() scheitert, wenn das Bild nicht vollständig ist, dann ist das ja schon der Test.
Folglich:
...
$resized = imagecreatetruecolor($newwidth,$newheight) ;
if($source = imagecreatefromjpeg($image)){
imagecopyresampled($resized,$source,0,0,0,0,$newwidth,$newheight,$oldwidth,$oldheight);
imagejpeg($resized,$dir."/"."new_".$file);
imagedestroy($resized);
imagedestroy($source);
}
...
Jedenfalls Dank an alle, die sich vielleicht den Kopf zerbrochen haben.
Martin