ugrás a tartalomhoz

Kép mentése űrlapról mappába, ebből thumbnail készítése egy másikba ->fekete lesz az összes thumbnail. Hol a hiba?

lord · 2014. Már. 28. (P), 17.16
Bekérem az űrlapról a képet. Ezt lementem a nagyképek mappába. Ezt a képet átméretezem. Levágom négyzet alakúra. A keletkezett képet kimentem a kisképek mappába. Megjelenítem a kisképek mappa tartalmát.
Ez mind szép és jó, ha 2 külön fájllal dolgozom.(A képbekérés és lementés külön, valamint a levágás átméretezés külön. Nyilván így a levágásnak fix képet adok meg, semmi köze a 2 kódnak egymáshoz.) A probléma ott kezdődik,hogy ha összerakom egy fájlba a két kódot, a kisképek egytől egyik feketék lesznek. A nevük, a kiterjesztésük, a méretük, a helyük, minden megfelel, kivéve azt,hogy csak fekete képeket kapok. Mitől lehet?
  1. <?php  
  2. function ekezettelenito($szoveg) {  
  3.     $mit  = array(" ""_""á""é""í""ó""ö""ő""ú""ú""ű""Á""É""Í""Ó""Ö""Ő""Ú""Ü""Ű");  
  4.     $mire = array("-""-""a""e""i""o""o""o""u""u""u""A""E""I""O""O""O""U""U""U");  
  5.     return strtolower(str_replace($mit$mire$szoveg));  
  6. }  
  7.   
  8. if (isset($_POST['ok'])) {  
  9.       
  10.     $tipusok = array("image/jpeg""image/gif""image/png");  
  11.     $bejovonev=mysql_real_escape_string(strip_tags(trim($_POST['nev'])));  
  12.       
  13.     if (in_array($_FILES['kep']['type'], $tipusok) && $_FILES['kep']['size'] < 2000000 && (!emptyempty($bejovonev)) ) {  
  14.   
  15.         switch ($_FILES['kep']['type']) {  
  16.             case "image/jpeg"$kiterjesztes = ".jpg"break;  
  17.             case "image/gif":  $kiterjesztes = ".gif"break;  
  18.             case "image/png":  $kiterjesztes = ".png"break;  
  19.         }  
  20.   
  21.         $nev = ekezettelenito($bejovonev);  
  22.           
  23.         $eredeti    = $_FILES['kep']['name'];  
  24.         $ideiglenes = $_FILES['kep']['tmp_name'];  
  25.         $tipus      = $_FILES['kep']['type'];  
  26.         $hiba       = $_FILES['kep']['error'];  
  27.         $meret      = $_FILES['kep']['size'];  
  28.   
  29.         $kiiras = "<p>A fájl tulajdonságai:</p>  
  30.         <ul>  
  31.             <li>név: {$nev}</li>  
  32.             <li>típus: {$tipus}</li>  
  33.             <li>ideiglenes név: {$ideiglenes}</li>  
  34.             <li>hiba száma: {$hiba}</li>  
  35.             <li>mérete: ".round($meret/1024)." KByte</li>  
  36.         </ul>\n";  
  37.         move_uploaded_file($ideiglenes"../kepek/nagykepek/{$nev}{$kiterjesztes}");  
  38.           
  39.           
  40.           
  41.         $new=142;  
  42.         $picture="../kepek/nagykepek/{$nev}{$kiterjesztes}";  
  43.           
  44.             switch ($kiterjesztes) {  
  45.             case ".jpg"$orig=imagecreatefromjpeg($picture); break;  
  46.             case ".gif":  $orig=imagecreatefromgif($picture); break;  
  47.             case ".png":  $orig=imagecreatefrompng($picture); break;  
  48.         }  
  49.           
  50.         list($width$height) = getimagesize($picture);  
  51.         $crop= ($width>$height) ? $height$width;   
  52.         $dest= imagecreatetruecolor($new,$new);  
  53.           
  54.         if($kiterjesztes=".png"){  
  55.             imagecolortransparent($dest, imagecolorallocatealpha($dest, 0, 0, 0, 127));  
  56.             imagealphablending($dest, false);  
  57.             imagesavealpha($dest, true);  
  58.         }  
  59.           
  60.         imagecopyresampled($dest$orig, 0, 0, 0, 0, $new$new$crop$crop);  
  61.   
  62.         switch ($kiterjesztes) {  
  63.             case ".jpg": header('Content-Type: image/jpeg'); break;  
  64.             case ".gif": header('Content-Type: image/gif'); break;  
  65.             case ".png": header('Content-Type: image/png'); break;  
  66.         }  
  67.         switch ($kiterjesztes) {  
  68.             case ".jpg": imagejpeg($dest,"../kepek/kiskepek/{$nev}{$kiterjesztes}"); break;  
  69.             case ".gif": imagegif($dest,"../kepek/kiskepek/{$nev}{$kiterjesztes}"); break;  
  70.             case ".png": imagepng($dest,"../kepek/kiskepek/{$nev}{$kiterjesztes}"); break;  
  71.         }  
  72.           
  73.     }  
  74.     else {  
  75.         $kiiras = "<p><em>Érvénytelen fájlformátum vagy fájlnév!</em></p>\n";  
  76.     }  
  77. }  
  78.   
  79. $konyvtar = "../kepek/kiskepek/";  
  80. $tartalom = scandir($konyvtar);  
  81. $tipusok  = array(".jpg"".gif"".png");  
  82. $kepek    = "";  
  83.   
  84. foreach ($tartalom as $fajl) {  
  85.     if (in_array(substr($fajl, -4), $tipusok)) {  
  86.         $kepek.= "<img src=\"{$konyvtar}{$fajl}\" alt=\"{$fajl}\" />\n";  
  87.     }  
  88. }  
  89.   
  90. ?><!DOCTYPE html>  
  91. <html lang="hu">  
  92. <head>  
  93. <meta charset="utf-8" />  
  94. </head>  
  95.   
  96. <body>  
  97. <?php if (isset($kiiras)) print $kiiras; ?>  
  98. <form method="post" action="" enctype="multipart/form-data">  
  99.     <p>Név:<br />  
  100.     <input type="text" id="nev" name="nev" /></p>  
  101.     <p>Kép:<br />  
  102.     <input type="file" id="kep" name="kep" /></p>  
  103.     <p><input type="submit" id="ok" name="ok" value="Feltöltöm" />  
  104.     </p>  
  105. </form>  
  106. <?php print $kepek; ?>  
  107. </body>  
  108. </html>  
 
1

Hibakeresés

Hidvégi Gábor · 2014. Már. 28. (P), 17.38
if($kiterjesztes=".png"){Jól nézd meg ezt a sort. Persze nem biztos, hogy ez okozza a gondot.

Ajánlom figyelmedbe az Egyszerű hibakeresés című cikket.
2

Nem ez okozza a problémát, az

lord · 2014. Már. 28. (P), 17.45
Nem ez okozza a problémát, az az if utólag került bele egy "tedd ezt bele az átlátszó png miatt" megjegyzés alapján.

A cikket köszönöm, szinte mindenen kerestem már hibát, és úgy tűnik,minden a helyén van, ezért tettem fel a kérdést.
3

Tehát javítottad az említett

Endyl · 2014. Már. 28. (P), 17.54
Tehát javítottad az említett sort, és még mindig rossz (avagy, mielőtt az az if belekerült, jó volt)?
Esetleg berakhatnád a jól működő változatot is (ha jól értem, hogy van olyan).
4

Mielőtt az if bekerült volna,

lord · 2014. Már. 28. (P), 18.04
Mielőtt az if bekerült volna, már nem volt jó. Amíg két külön fájlban volt a feltöltés-nagyképmentés-mappalistázás és a levágás-átméretezés-mappábamentés egymástól függetlenül,addig működött. Nincs már meg sajnos a legutolsó 2fájlos működő változat,csak az első változat fele, amíg csak jpg-t mentettem ki. Megpróbálom rekonstruálni a legutolsó működő változatot,csak baromi sok időt elvesz.
5

Nálam működik

Endyl · 2014. Már. 28. (P), 18.35
A kódot átmásolva a következő javításokkal nekem működik:

  • az if($kiterjesztes=".png"){ sort javítottam értékadásról összehasonlításra
  • kivettem a header hívásokat, lévén html-t akarsz megjeleníteni, nem képet
  • kivettem a mysql_real_escape_stringet (miért van ez egyáltalán benne?)
6

Az összehasonlítást

lord · 2014. Már. 28. (P), 19.23
Az összehasonlítást kifejtenéd,ha szépen megkérlek?
A header rész mit befolyásol? Az azért van benne,mert fogalmam sincs, hogy mit csinál,de mindenhol ott van.
A mysql_real_escape_string azért van benne, mert úgy volt, hogy adatbázisban fogom tárolni a képek nevét, helyét és leírását és egy nem védett oldalon megjelenítem őket galériaként. Ez még csak a feltöltés tesztje, hogy meg tudom-e egyáltalán csinálni a képek két helyre mentését.


Közben megtaláltam - ez működik mind3 fájltípussal:
  1. <?php  
  2.   
  3. //$nev="asd2.jpg";  
  4. //$nev="asd2.png";  
  5. $nev="asd2.gif";  
  6.   
  7. $new=142;  
  8.   
  9. //$picture="111.jpg";  
  10. //$picture="asdasd.png";  
  11. $picture="xx.gif";  
  12.   
  13. //$orig=imagecreatefromjpeg($picture);  
  14. //$orig=imagecreatefrompng($picture);  
  15. $orig=imagecreatefromgif($picture);  
  16.   
  17. list($width$height) = getimagesize($picture);  
  18.   
  19. $crop= ($width>$height) ? $height$width;   
  20.   
  21. $dest= imagecreatetruecolor($new,$new);  
  22.   
  23. imagecopyresampled($dest$orig, 0, 0, 0, 0, $new$new$crop$crop);  
  24.   
  25. //header('Content-Type: image/jpeg');  
  26. //header('Content-Type: image/png');  
  27. header('Content-Type: image/gif');  
  28.   
  29. imagejpeg($dest,"../kepek/kiskepek/{$nev}");  
  30.   
  31. ?>  
8

A header rész mit befolyásol?

Hidvégi Gábor · 2014. Már. 28. (P), 19.50
A header rész mit befolyásol? Az azért van benne,mert fogalmam sincs, hogy mit csinál,de mindenhol ott van.
Ha nem tudsz valamit, akkor olvass utána!
9

RTFM? :)

Endyl · 2014. Már. 28. (P), 20.25
A fenti kérdésekre könnyen választ találnál a vonatkozó manualok elolvasásával, de adok egy kis segítséget:



Összehasonlítás vs. értékadás

Ez a sor:
if($kiterjesztes=".png"){
nyilvánvalóan nem ugyanaz, mint ez:
if($kiterjesztes==".png"){

Az első egy értékadó kifejezést tartalmaz az elágazás feltételeként, ami először beállítja $kiterjesztes értékét ".png"-re, majd az if teszteli ennek az értéknek az "igazságát" (ami minden esetben TRUE lesz).

A második egy összehasonlító kifejezés, ami kiértékelődik igazra vagy hamisra, majd ezt vizsgálja az if.

Célszerű fordítva írni az összehasonlításokat (pl.: ".png"==$kiterjesztes, így ha lefelejtesz egy egyenlőségjelet, akkor szólni fog a fordító/futtatókörnyezet, hogy valami nincs rendben.



header()

A header() függvénnyel HTTP fejlécek küldésére utasíthatjuk a szkriptünket futtató webszervert. A Content-type fejléc például megmondja a böngészőnek, hogy miként értelmezze a kapott fájlt. Ha azt mondod neki, hogy képet küldesz, de valójában html-t írsz a kimenetre, akkor természetes, hogy a böngésző nem tud majd mit megjeleníteni és adott esetben feketeséget és/vagy hibaüzenetet látsz.



mysql_real_escape_string

A mysql_* függvények használata helyett (lévén elavultak) ajánlom a mysqli_* vagy a PDO függvények használatát, azon belül is a prepared statementeket (mysqli/PDO) és akkor nem kell bajlódnod a mysql_real_escape_string használatával.




Legközelebb, mielőtt kódot ollózol össze innen-onnan, értsd meg, hogy minden egyes sora mit csinál, különben ehhez hasonló dolgokba fogsz ütközni. (És nem fogjuk (akár én, akár más) minden esetben így a szádba rágni a dolgokat, hanem csak annyit fogunk írni, ami a hozzászólásom címében is szerepel.)

Ha van további kérdésed, azokat a vonatkozó manualok elolvasása és megértése és a kedvenc keresőd kimerítő használata után tedd fel, ha mindeközben még nem kaptál volna választ rájuk.
10

Köszönöm

lord · 2014. Már. 28. (P), 20.53
Az összehasonlítás vs értékadás részt köszönöm. Nem azzal van a bajom,hogy nem tudom mit csinál a == vagy a = hanem azzal,hogy nem tudom a nevüket. Ha azt mondod,lemaradt egy egyenlőségjel, értem, és azt is,hogy miért. Ha azt, hogy összehasonlítás, akkor nem. Sajnos a szakszavakkal még hadilábon állok.

header()

A header() függvénnyel HTTP fejlécek küldésére utasíthatjuk a szkriptünket futtató webszervert. A Content-type fejléc például megmondja a böngészőnek, hogy miként értelmezze a kapott fájlt. Ha azt mondod neki, hogy képet küldesz, de valójában html-t írsz a kimenetre, akkor természetes, hogy a böngésző nem tud majd mit megjeleníteni és adott esetben feketeséget és/vagy hibaüzenetet látsz.


Nem a böngészővel van baj. A mappába is fekete képként menti le. Az első kódban,ami a kérdésben szerepel, a header-nél áll meg a dolog,addig minden rendesen működik. (Az if részt kikommenteltem már az elején,így az nem zavarhat be,akkor sem,ha hibás.)
A problémám azzal van,hogy az előző kommentbe írt kódom viszont tökéletesen működik.

A PDO-val próbálkozom mostanában,de még elég nehéz átállni,hogy értsem is,amit csinálok és ne dobjon vissza fölösleges hibákat még az is,ha elrontok valamit.


Legközelebb, mielőtt kódot ollózol össze innen-onnan, értsd meg, hogy minden egyes sora mit csinál, különben ehhez hasonló dolgokba fogsz ütközni.


A legjobb tudásom szerint próbálom összeállítani a kódjaimat, valahogy meg kell tanulnom,hogy mi mit csinál,de nem mindig értem meg a manualokat sem. Így néz ki az első verzióm,láthatod,hogy minden sort próbálok észbentartani:
  1. <?php  
  2. $nev="asd2.jpg";  
  3. //ikonméret  
  4. $new=142;  
  5. //kép forrása  
  6. $picture="xx2.jpg";  
  7. $orig=imagecreatefromjpeg($picture);  
  8. //kép nagysága  
  9. list($width$height) = getimagesize($picture);  
  10. /*if ($width>$height) print "Fekvő"; 
  11. elseif ($width<$height) print "Álló"; 
  12. else print "Négyzet";*/  
  13. //kivágási méret  
  14. $crop= ($width>$height) ? $height$width//$crop= a kivágás nagysága..ha a szélessége nagyobb,mint a magassága,akkor a magasságát veszem  
  15. //képvászon létrehozása  
  16. $dest= imagecreatetruecolor($new,$new);  
  17.   
  18. //kép kivágása  
  19. imagecopyresampled($dest$orig, 0, 0, 0, 0, $new$new$crop$crop);  
  20. //jpg kép előállítása a böngésző miatt?  
  21. header('Content-Type: image/jpeg');  
  22.   
  23. imagejpeg($dest,"../kepek/kiskepek/{$nev}");  
  24.   
  25. ?>  
11

Kipróbáltad a témanyitóban

Endyl · 2014. Már. 28. (P), 21.42
Kipróbáltad a témanyitóban írt kódot a módosításokkal, amiket írtam?

Mert mint mondtam, nálam úgy működött gond nélkül. Ha nem, akkor próbáld ki, és ha úgy sem megy, akkor ahogy Gábor írta, sorról-sorra menj végig a kódon a kedvenc hibakeresési módszereddel, és nézd meg, hogy hol lesz valamelyik változónak/kimenetknek/függvényhívásnak más az értéke/hatása, mint amit szeretnél/várnál és ennek az eredményét írd meg, ha nem sikerül megoldani.
13

Kivettem a header részt és

lord · 2014. Már. 28. (P), 22.19
Kivettem a header részt és átírtam a switch-case-eket if-elseif-re és működik. Köszönöm a segítségeteket.
12

de nem mindig értem meg a

Hidvégi Gábor · 2014. Már. 28. (P), 22.05
de nem mindig értem meg a manualokat sem
Egy jó szótár aranyat ér, egyébként pedig elég hamar bele lehet jönni az angolba, mert a szaknyelv viszonylag kevés szóból áll.
14

Így, hogy magyarul sem értem

lord · 2014. Már. 28. (P), 22.21
Így, hogy magyarul sem értem a szakszavakat, először ezt kellene megtanulni,aztán jöhet az angol változatuk. Ha már így szóba került, létezik magyar informatikai értelmező kéziszótár? :)
15

Akkor használj keresőt, de ha

Hidvégi Gábor · 2014. Már. 28. (P), 22.31
Akkor használj keresőt, de ha ott nem találsz kielégítő leírást, kérdezd meg itt, mi mit jelent (a biztonság kedvéért írd oda, hogy kezdő vagy, esetleg kérj linket, hol tudsz utánaolvasni).
7

Soronként végig kell menni a

Hidvégi Gábor · 2014. Már. 28. (P), 19.36
Soronként végig kell menni a kódon, és meg kell nézni, a változók olyan értékeket tartalmaznak-e, amit vársz.