Problem med uppladdningsscript för bilder i PHP

Permalänk
Medlem

Problem med uppladdningsscript för bilder i PHP

Har problem med ett PHP script som ska ladda upp bilder. Jag får följande fel

Warning: imagesx(): supplied argument is not a valid Image resource in /.../httpd.www/admin/edit.php on line 36 Warning: imagesy(): supplied argument is not a valid Image resource in /.../httpd.www/admin/edit.php on line 37 Warning: imagecopyresampled(): supplied argument is not a valid Image /.../httpd.www/admin/edit.php on line 39 Warning: imagejpeg() [function.imagejpeg]: Unable to access images/thumbs/ in /.../httpd.www/admin/edit.php on line 41 Warning: imagejpeg() [function.imagejpeg]: Invalid filename in /.../httpd.www/admin/edit.php on line 41 Warning: imagedestroy(): supplied argument is not a valid Image resource in /.../httpd.www/admin/edit.php on line 44

Med följande kod:

function createthumb($type, $tmp_name, $namn, $new_w, $new_h) { $system = explode(".", $name); $fext_n = count($system)-1; if ($type == "image/jpeg") { $src_img = imagecreatefromjpeg($tmp_name); } if ($type == "image/png") { $src_img = imagecreatefrompng($tmp_name); } if ($type == "image/gif") { $src_img = imagecreatefromgif($tmp_name); } $old_x = imageSX($src_img); $old_y = imageSY($src_img); $dst_img = ImageCreateTrueColor($new_w, $new_h); imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, $old_x, $old_y); imagejpeg($dst_img, "images/thumbs/$namn", 90); imagedestroy($dst_img); imagedestroy($src_img); } //Ladda upp bild if($_GET['vad'] == "bilder" && $_GET['action'] == "upload" && isset($_POST['submit'])){ if($_FILES["file"]["error"] > 0 && $_FILES['file']['size'] > 4096000){ echo "Uppladdningen misslyckades:<br />" . $_FILES['file']['error']; } $namn = $_FILES["file"]["name"].uniqid(); if($_FILE["file"]["type"] == "image/jpg"){ $typ = ".jpg"; } if($_FILE["file"]["type"] == "image/gif"){ $typ = ".gif"; } if($_FILE["file"]["type"] == "image/png"){ $typ = ".png"; } move_uploaded_file($_FILES["file"]["tmp_name"], "../images/".$namn.$typ); createthumb($_FILES["file"]["type"], "../images/".$fname, $fnamn, 120, 120); $rnamn = $_FILES["file"]["name"]; $typ = $_FILES["file"]["type"]; $storlek = $_FILES["file"]["size"]; $galleriid = $_POST['galleriid']; $sql = "INSERT INTO `XCMS_bilder` (`id`, `galleri_id`, `namn`, `filnamn`, `storlek`, `typ`) VALUES (NULL, '$galleriid', '$namn', '$fname', '$storlek', '$typ');"; mysql_query($sql) or die("Frågan misslyckades:<br /><br />".$sql."<br /><br />".mysql_error()); } ?> <form action="edit.php?vad=bilder&action=upload" method="post"> <label for="file">Ny bild:</label> <input type="text" name="namn" id="namn" /> <input type="file" name="file" id="file" /><br /> <input type="submit" name="submit" value="Ladda upp" /> </form>

Troligtvis bara något litet småfel jag inte hittar Bilden verkar aldrig laddas upp korrekt.

Permalänk

if ($type == "image/jpeg") { $src_img = imagecreatefromjpeg($tmp_name); } if ($type == "image/png") { $src_img = imagecreatefrompng($tmp_name); } if ($type == "image/gif") { $src_img = imagecreatefromgif($tmp_name); }

Som det ser ut nu så skapas ingen GD-bildresurs om $type inte överensstämmer med någon av typerna. Byt ut det hela mot en switch-sats eller en if-sats med elseif och slutligen en else;

switch ($type): case 'image/png': $src_img = imagecreatefrompng($tmp_name); break; case 'image/gif': $src_img = imagecreatefromgif($tmp_name); break; case 'image/jpg': $src_img = imagecreatefromjpeg($tmp_name); break; default: return false; // felhantering borde göras hår då bilden (/filen) är av en typ som inte skriptet kan hantera endswitch;

Permalänk
Medlem

Det skulle jag ju kunna göra men det borde inte vara problemet eftersom att filen som jag testar med är en jpg fil.

Permalänk

Enligt PHP är $src_img i din kod ingen bildresurs och anledningen till detta är att ingen resurs skapas i den kodsnutt jag citerade i förra inlägget. Då inget felmeddelande nämner imagecreatefromjpeg()/png()/gif() måste detta antingen betyda att 1) ingen av dessa funktioner har kallats, eller 2) att ett fel skedde när de kallades, men att inget felmeddelande skrevs ut. Utav dessa två alternativ är 1 mest troligt pga att andra felmeddelanden har skrivits ut (vilket tyder på att error-reporting är påslaget). Då ingen av imagecreatefrom*()-funktionerna har kallats är det med stor säkerhet variabeln $type som har ett annat värde än de som söks (image/jpeg, gif och png).

Som jag skrev tidigare rekommenderar jag starkt att du ersätter den väldigt svaga if-delen i funktionen mot antingen en switch eller en kombination av if/elseif/else. Som en funktion är createthumb() för närvarande dåligt designad (dock pga flera anledningar än just denna).

Ska se över koden, återkommer strax.

Edit: Du har använt variabeln $_FILE på ställen där jag tar det för givet att du tänkt använda $_FILES.
Ta en titt på paragrafen om $_FILES['userfile']['type'] på http://se.php.net/manual/en/features.file-upload.php, jag har varken testat ditt skript eller kollat om webbläsaren skickar mimetype, men skulle gissa på att det som står i manualen är anledningen till att det inte fungerar som det ska.

Citat:

$_FILES['userfile']['type']
The mime type of the file, if the browser provided this information. An example would be "image/gif". This mime type is however not checked on the PHP side and therefore don't take its value for granted.

Permalänk
Medlem

Testade att bara köra print_r($_FILES); för att se vad det står. Det enda som den matar ut är "Array()". Borde det inte vara massor av annat där också?

edit: Nu körs funktionen createimagefromjpeg(). Och lämnar lite errors:

Citat:

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in httpd.www/admin/edit.php on line 27

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: '../images/' is not a valid JPEG file in httpd.www/admin/edit.php on line 27

På den första verkar det ju vara något fel med funktionen. Bör jag ta kontakt med mitt webbhotell om det?

Permalänk

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: '../images/' is not a valid JPEG file in httpd.www/admin/edit.php on line 27
Du har glömt sökvägen till själva bilden.

Permalänk
Medlem

Ett par fel:

if($_FILES["file"]["error"] > 0 && $_FILES['file']['size'] > 4096000){

Vad händer om error är över noll men storleken är under din maxstorlek?
Och...Varför låter du scriptet fortsätta med filuppladdningen efter du har skrivit ut att uppladdningen misslyckades.

I denna kodrad:

<form action="edit.php?vad=bilder&action=upload" method="post">

Lägg till detta:

enctype="multipart/form-data"

Varför vill du skriva ut hela SQL frågan om någonting blir fel för besökaren?

mysql_query($sql) or die("Frågan misslyckades:<br /><br />".$sql."<br /><br />".mysql_error());

Inför lite vettig felhantering istället för att bara döda allting med en die(), die hjälper ingenting för besökaren, blir bara värre av att se en sida som aldrig laddar eller bara halvt utan en vettig förklaring.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Rosenson
Ett par fel:

if($_FILES["file"]["error"] > 0 && $_FILES['file']['size'] > 4096000){

Vad händer om error är över noll men storleken är under din maxstorlek?
Och...Varför låter du scriptet fortsätta med filuppladdningen efter du har skrivit ut att uppladdningen misslyckades.

I denna kodrad:

<form action="edit.php?vad=bilder&action=upload" method="post">

Lägg till detta:

enctype="multipart/form-data"

Varför vill du skriva ut hela SQL frågan om någonting blir fel för besökaren?

mysql_query($sql) or die("Frågan misslyckades:<br /><br />".$sql."<br /><br />".mysql_error());

Inför lite vettig felhantering istället för att bara döda allting med en die(), die hjälper ingenting för besökaren, blir bara värre av att se en sida som aldrig laddar eller bara halvt utan en vettig förklaring.

1. Har jag fixat.

2. Det använder jag nu innan jag har fått igång sidan. När det inte blir några fel längre ska jag byta ut det

Permalänk
Medlem

enctype="multipart/form-data" , la du till det? Det krävs ju för att man ska kunna skicka filer i formulär.
Känns som att det är orsaken till att print_r($_FILES) bara ger Array(). Filen laddas aldrig upp.
Eller är det något annat fel som jag inte ser?

Permalänk
Medlem

Nu har jag ändrat lite i koden så den ser ut såhär:

function createthumb($type, $tmp_name, $namn, $new_w, $new_h) { $system = explode(".", $name); $fext_n = count($system)-1; switch ($type): case 'image/png': $src_img = imagecreatefrompng($tmp_name); break; case 'image/gif': $src_img = imagecreatefromgif($tmp_name); break; case 'image/jpeg': $src_img = imagecreatefromjpeg($tmp_name); break; default: $src_img = "abc"; endswitch; $old_x = imageSX($src_img); $old_y = imageSY($src_img); $dst_img = ImageCreateTrueColor($new_w, $new_h); imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, $old_x, $old_y); imagejpeg($dst_img, "../images/thumbs/$namn", 90); imagedestroy($dst_img); imagedestroy($src_img); } //Ladda upp bild if($_GET['vad'] == "bilder" && $_GET['action'] == "upload" && isset($_POST['submit'])){ print_r($_FILES); if($_FILES["file"]["error"] > 0 && $_FILES['file']['size'] > 4096000){ echo "Uppladdningen misslyckades:<br />" . $_FILES['file']['error']; exit; } $namn = uniqid().$_FILES["file"]["name"]; switch ($_FILES["file"]["type"]): case 'image/png': $src_img = imagecreatefrompng($tmp_name); break; case 'image/gif': $src_img = imagecreatefromgif($tmp_name); break; case 'image/jpeg': $src_img = imagecreatefromjpeg($tmp_name); break; default: $src_img = "abc"; endswitch; if($src_img == "abc"){ echo "Felaktig filtyp."; exit; } move_uploaded_file($_FILES["file"]["tmp_name"], "../images/".$namn.$typ); createthumb($_FILES["file"]["type"], "../images/".$namn, $namn, 120, 120); $rnamn = $_FILES["file"]["name"]; $typ = $_FILES["file"]["type"]; $storlek = $_FILES["file"]["size"]; $galleriid = $_POST['galleriid']; $sql = "INSERT INTO `XCMS_bilder` (`id`, `galleri_id`, `namn`, `filnamn`, `storlek`, `typ`) VALUES (NULL, '$galleriid', '$namn', '$fname', '$storlek', '$typ');"; mysql_query($sql) or die("Frågan misslyckades:<br /><br />".$sql."<br /><br />".mysql_error()); } ?> <form action="edit.php?vad=bilder&action=upload" method="post" enctype="multipart/form-data"> <label for="file">Ny bild:</label> <input type="text" name="namn" id="namn" /> <input type="file" name="file" id="file" /><br /> <input type="submit" name="submit" value="Ladda upp" /> </form>

Fast nu får jag felet att den itne hittar bilden. Men bilden existerar i den sökvägen som jag har angivit. Kan man gå neråt i mappstrukturen i PHP?

edit: löste det genom att ändra en sökväg. Nu funkar det bra

edit2: Det funkgerar inte så bra med stora bilder. Om jag laddar in en bild tagen i min digitalkamera på max kvalité så säger servern: "Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 11264 bytes) in /httpd.www/admin/edit.php on line 27". Man jag antar att det inte finns något sätt att lösa det på

Permalänk
Medlem

Jodå, det går att ställa in hur mycket minne en allokering får tillgång till.

$mem = 100000000;
ini_set('memory_limit', $mem);

Leta på nåt bra värde du trivs med - och googla på memory_limit eller kolla php-dokumentationen så att du förstår vad det hela innebär och vilka konsekvenser som finns.

Permalänk
Medlem

grejen är att det inte är min egen server. Utan allt ligger på ett wennhotell. Tror inte att dom tillåter att jag ändrar det värdet

Permalänk
Medlem

loopia tillåter iaf - för det var dom som lärde mig knepet. Hur det är med andra hotell vet jag inte.

Ett tips är att du sätter storleken vid manipulering av varje bild. Sätt storleken till bredd (px) * höjd (px) * 2 ungefär. Då får du ungefär det som behövs i minnesväg.