Problem bei Bildupload wenn Pixelmaße zu groß sind
erawan
- php
Hallo,
ich habe folgendes Problem, bei dem ich hoffe ihr könnt mir weiterhelfen:
Der Upload von JPG-Fotos über mein Redaktionstool (siehe Code nachfolgend) funktioniert an sich ganz gut aber leider nur solange die Pixelmaße/Bildfläche unter 1.500.000 Bildpunkten bleibt.
Beispiel: 1250 x 1250 funktioniert nicht, 1225 x 1225 jedoch schon
(unabhängig von der Dateigröße - das Bild mit 1225x1225 funktioniert auch dann noch wenn die Dateigröße fast die doppelten KBs vom anderen Bild hat)
Da dieser Upload auf anderen Webhosts bereits ohne diesen Fehler im Einsatz ist, nehme ich an, dass dies wahrscheinlich am Provider liegt oder?
Hat jemand eine Ahnung an welchem Parameter dies liegen könnte? (Damit ich diese Info dann an meinen Provider weiterleiten kann - sonst warte ich dort vergebens auf eine Lösung!)
Danke im Voraus für eure Infos & Hilfe.
Lg erawan
Bilduploadformular
<label>Upload: <input name='userimg' type='file' value='' /> (Nur JPG-Dateien, max. 1,5 MB, Bild wird automatisch verkleinert)</label>
Formularhandler (Bildcheck wird noch ohne Probleme gemacht dann ist Ende)
$var = date("ymd_");
$destdir = "../media/meldungen/";
include("uploads.php"); // siehe Code nachfolgend
// Upload des Bildes
if (isset($_FILES["userimg"]) && !empty($_FILES["userimg"]["name"])) {
$name = $var.strtolower(strtr($_FILES["userimg"]["name"],' ','_'));
if(!CheckBild("userimg")){ echo "<p class='errmsg'><b>Bild-Check NICHT erfolgreich</b></p>\n"; break; }else{
echo "<p class='okmsg'><b>Bild-Check erfolgreich</b></p>\n"; }
if(SaveBild("userimg","320","75",$destdir,$name)){
$news_bild = $name;
echo "<p class='okmsg'><b>Bild-Upload erfolgreich</b></p>\n";
}else{
$news_bild = "";
echo "<p class='errmsg'><b>Bild-Upload NICHT erfolgreich</b></p>\n";
}
}
Dateihandler
function CheckBild($userinput){
$pfad = pathinfo($_FILES[$userinput]["name"]);
$extorig = $pfad["extension"];
$ext = strtolower($extorig);
if ( $ext != "jpg" && $ext != "jpeg"){
print("<p class='errmsg'><b>Das Dateiformat des angegebenen Bildes ist nicht erlaubt (.$ext)!</b><br/><br/><a href='javascript:history.back()'>zurück zum Formular</a></p>\n");
return false;
}
$size = $_FILES[$userinput]["size"];
if ( $size > 2000000){
$sizekb = round(strtr(($size/1024),'.',','),2);
print("<p class='errmsg'><b>Das angegebene Bild ist zu groß ($sizekb KB)! Bitte wählen Sie ein kleineres!</b><br/><br/><a href='javascript:history.back()'>zurück zum Formular</a></p>\n");
return false;
}
return true;
}
function SaveBild($userinput, $maxsize, $qualitaet, $destdir, $name){
// Bildmaße ermitteln
$size = @getimagesize($_FILES[$userinput]["tmp_name"]);
$orig_width = $size[0];
$orig_height = $size[1];
// Bild zuschneiden ja/nein
if($orig_width > $maxsize || $orig_height > $maxsize){
// ja - neue Maße ausrechnen
if($orig_width > $orig_height) {
// Querformat
$new_width = $maxsize;
$imgprop = $new_width / $orig_width;
$imgvsize = $orig_height * $imgprop;
$new_height = ceil($imgvsize);
}else{
// Hochformat
$new_height = $maxsize;
$imgprop = $new_height / $orig_height;
$imghsize = $orig_width * $imgprop;
$new_width = ceil($imghsize);
}
}else{
// nein - keine Anpassung nötig
$new_width = $orig_width;
$new_height = $orig_height;
}
$ziel = $destdir.$name;
$orig_file = imagecreatefromjpeg($_FILES[$userinput]["tmp_name"]);
$new_file = imagecreatetruecolor($new_width, $new_height);
$image = imagecopyresampled($new_file, $orig_file, 0, 0, 0, 0, $new_width, $new_height, $orig_width, $orig_height);
if(imagejpeg($new_file, $ziel, $qualitaet)){
@imagedestroy($orig_file);
@imagedestroy($new_file);
@imagedestroy($image);
chmod($ziel,0644);
return true;
}else{
@imagedestroy($orig_file);
@imagedestroy($new_file);
@imagedestroy($image);
return false;
}
}
Moin
Hat jemand eine Ahnung an welchem Parameter dies liegen könnte? (Damit ich diese Info dann an meinen Provider weiterleiten kann - sonst warte ich dort vergebens auf eine Lösung!)
Es liegt am memory_size. Diesen kannst du, sofern vom Provider erlaubt, mit der function ini_set temporär erhöhen.
Gruß Bobby
Es liegt am memory_size. Diesen kannst du, sofern vom Provider erlaubt, mit der function ini_set temporär erhöhen.
Hallo Bobby,
Danke für den Hinweis, aber sollte bei einem Problem mit dem memory_limit nicht der Fehler Fatal error: Allowed memory size of xxx bytes exhausted at (xx):0 (tried to allocate xx bytes) auftreten (den ich eh schon sehr oft genossen habe und demnach gut kenne)
Außerdem hab ichs nun mal ausprobiert und entweder funktioniert die temporäre einstellung mit ini_set nicht oder es liegt nicht daran.
Ich hoffe der sonstige Umgang mit dem Bildupload ist in Ordnung oder gibt es dafür bessere Methoden?
MfG erawan
Moin
Danke für den Hinweis, aber sollte bei einem Problem mit dem memory_limit nicht der Fehler Fatal error: Allowed memory size of xxx bytes exhausted at (xx):0 (tried to allocate xx bytes) auftreten (den ich eh schon sehr oft genossen habe und demnach gut kenne)
Aha! Und was für Fehler erscheint da? Oder ist es eine weiße Seite? Ist die Fehlerausgabe vielleicht einfach nur vom Provider unterdrückt? Fragen über Fragen die es zuerst zu klären gilt.
Hast du nachdem du mit ini_set() die memory_size angesprochen hast das Ergebnis mit phpinfo() geprüft? Es wäre sinnvoll einige Werte in der PHPinfo zu überprüfen (max-Filesize, maxuploadsize, memory_limit max_execution_time usw.)
Gruß Bobby
Aha! Und was für Fehler erscheint da? Oder ist es eine weiße Seite? Ist die Fehlerausgabe vielleicht einfach nur vom Provider unterdrückt? Fragen über Fragen die es zuerst zu klären gilt.
Derzeit erscheint kein Fehler, darum auch meine Nachfrage. Werde demnach mit dem Provider klären ob diese unterdrückt werden bzw. mal php_info laufen lassen und schauen was so raus kommt. Danke erstmal.
MfG erawan
So. Geschafft (fürs erste)
Der neue Provider hatte so ziemlich alles abgedreht (error display, sogar phpinfo) und die Limits aufs mindeste Minimum gesetzt.
Konnte dies nun entsprechend in der php.ini Datei ändern. Danke für den Tipp.
MfG erawan