PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bild auf Server laden / Grösse ändern


lasso
16.07.2004, 14:02:53
Hallo zusammen

Ich habe ein Script gemacht, um ein Bild per Formular hochzuladen. Die Ausgabe stimmt für zu grosse Bilder, existierende Bilder und für Bilder kleiner als die Maximalbreite.
Bei der Verkleinerung des Bildes allerdings haperts. Es gibt zwar keine Fehlermeldung, aber es wird immer "konnte Bild nicht auf server kopieren" ausgegeben. Wo könnte der Hase begraben sein?

Ausserdem möchte ich nicht auf JPEG beschränken, nehme ich aber nur imagecreate, so gibts eine fehlermeldung.

Danke und Gruss
Lasso


<?
$ordner = "../bild/news";
$sizelim = "yes";
$size = "180000";

if ($_REQUEST['submitted']){
$log = "";
if ($img_name == "") {
$log .= "kein Bild gewählt<br>";
}
if ($img_name != "") {
if (file_exists("$ordner/$img_name")) {
$log .= "Bild existiert schon<br>";
} else {
if (($sizelim == "yes") && ($img_size > $size)) {
$log .= "Bild ist zu gross<br>";
} else {
$groesse = getimagesize($img);
$maxwidth=400;
if ($groesse[0]>$maxwidth) {
$name = $img_name;
$mfaktor = $groesse[0]/$maxwidth;
$mwidth = $maxwidth;
$mheight = $groesse[1]/$mfaktor;
$imgold = ImageCreateFromJpeg($img);
$imgnew = imageCreate($mwidth, $mheight);
imagecopyresized($imgnew, $imgold, 0, 0, 0, 0, $mwidth, $mheight, $groesse[0], $groesse[1]);
@copy($imgnew, "$ordner/$name") or $log .= "konnte Bild nicht auf server kopieren<br>";
if (file_exists("$ordner/$name")) {
$log .= "Bild ist upgeloadet<br>"; }
} else {
@copy($img, "$ordner/$img_name") or $log .= "konnte Bild nicht auf server kopieren<br>";
if (file_exists("$ordner/$img_name")) {
$log .= "Bild ist upgeloadet<br>";
}
}
}
}
}
?>

lasso
18.07.2004, 10:46:40
Die Fehlermeldung ist übrigens folgende:

Warning: copy(Resource id #5): failed to open stream: No such file or directory in /home/cmgk.ch/htdocs/wineskaters/admin/flyer.php on line 28

Gruss
Lasso

xabbuh
18.07.2004, 11:16:32
Für mich sieht es danach aus, dass du ein Bild aus ein Datenbank liest, dieses in der Variablen $img speichern möchtest, aber du vergessen hast mysql_fetch_array() anzuwenden (wg. Resource id #5).

Überprüfe das mal.

lasso
18.07.2004, 12:10:42
Hallo Xabbuh

Das Bild kommt nicht aus einer Datenbank, sondern wird per Formular hochgeladen. $img läuft übrigens, solange das Bild nicht grösser als die 400px ist. Es muss also etwas innerhalb der Schlaufe if ($groesse[0]>$maxwidth) sein.

Gruss
Lasso

xabbuh
18.07.2004, 13:07:11
Musst du das Bild nicht nach imagecopyresized noch mit imagejpeg() (http://www.selfphp.info/funktionsreferenz/image_funktionen/imagejpeg.php) als jpeg an den Browser senden? Da kannst du dann ja als zweiten Parameter auch einen Dateinamen angeben. Möglicherweise kannst du dir dann auf diese Weise sogar copy (wobei move_uploaded_file besser wäre) schenken:


<?
$ordner = "../bild/news";
$sizelim = "yes";
$size = "180000";

if ($_REQUEST['submitted']){
$log = "";
if ($img_name == "") {
$log .= "kein Bild gewählt<br>";
}
if ($img_name != "") {
if (file_exists("$ordner/$img_name")) {
$log .= "Bild existiert schon<br>";
} else {
if (($sizelim == "yes") && ($img_size > $size)) {
$log .= "Bild ist zu gross<br>";
} else {
$groesse = getimagesize($img);
$maxwidth=400;
if ($groesse[0]>$maxwidth) {
$name = $img_name;
$mfaktor = $groesse[0]/$maxwidth;
$mwidth = $maxwidth;
$mheight = $groesse[1]/$mfaktor;
$imgold = ImageCreateFromJpeg($img);
$imgnew = imageCreate($mwidth, $mheight);
imagecopyresized($imgnew, $imgold, 0, 0, 0, 0, $mwidth, $mheight, $groesse[0], $groesse[1]);
imagejpeg($imgnew, $ordner/$name);
if (file_exists("$ordner/$name")) {
$log .= "Bild ist upgeloadet<br>"; }
} else {
@copy($img, "$ordner/$img_name") or $log .= "konnte Bild nicht auf server kopieren<br>";
if (file_exists("$ordner/$img_name")) {
$log .= "Bild ist upgeloadet<br>";
}
}
}
}
}
?>

lasso
18.07.2004, 17:22:04
das klappt nun mit jpeg ganz gut, auch ohne copy. Super!

Nur brauche ich nicht nur jpeg sondern auch gif, habe also das script noch etwas ausgebaut, erhalte aber bei gif-upload immer Call to undefined function: imagecreatefromgif(). jpeg nach wie vor kein problem...

Habe das so gelöst:

if ($groesse[2]==2) {
$imgold = imagecreatefromjpeg($img);
} elseif ($groesse[2]==1) {
$imgold = imagecreatefromgif($img); }

Gruss
Lasso

xabbuh
18.07.2004, 17:43:03
Aus rechtlichen Gründen wurde die GIF-Unterstützung ab der Version 1.6 in die GD-Bibliothek nicht mehr implementiert. Sie können also diesen Befehl nur
nutzen, wenn eine Version vor 1.6 existiert.

Daran dürfte es liegen.

lasso
18.07.2004, 18:22:14
ach so, grrrr... das wird es wohl sein. gibt es eine Möglichkeit, das zu umgehen?? sonst werde ich mich eben mit PNG rumschlagen (Transparenz...!)

xabbuh
18.07.2004, 21:01:07
Original geschrieben von lasso
ach so, grrrr... das wird es wohl sein. gibt es eine Möglichkeit, das zu umgehen?? sonst werde ich mich eben mit PNG rumschlagen (Transparenz...!)

So weit ich weiß, gibt es da keine Möglichkeit, das zu umgehen. Sind halt rechtliche Gründe.

Es sei denn du packst dir eine ältere Version der GD-Library auf den Computer. Aber dann sind wieder einige anderen Funktionen, die für neuere Versionen der Library funktionieren nicht mehr verfügbar.

lasso
18.07.2004, 22:26:09
naja, da kann man nichts machen. auf den webserver wo die seite aufgeschaltet wird hab ich ja eh keinen einfluss...

hauptsache es läuft mit jpg.

danke und gruss
lasso