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?
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?
■ 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?
<?php
function ekezettelenito($szoveg) {
$mit = array(" ", "_", "á", "é", "í", "ó", "ö", "ő", "ú", "ú", "ű", "Á", "É", "Í", "Ó", "Ö", "Ő", "Ú", "Ü", "Ű");
$mire = array("-", "-", "a", "e", "i", "o", "o", "o", "u", "u", "u", "A", "E", "I", "O", "O", "O", "U", "U", "U");
return strtolower(str_replace($mit, $mire, $szoveg));
}
if (isset($_POST['ok'])) {
$tipusok = array("image/jpeg", "image/gif", "image/png");
$bejovonev=mysql_real_escape_string(strip_tags(trim($_POST['nev'])));
if (in_array($_FILES['kep']['type'], $tipusok) && $_FILES['kep']['size'] < 2000000 && (!empty($bejovonev)) ) {
switch ($_FILES['kep']['type']) {
case "image/jpeg": $kiterjesztes = ".jpg"; break;
case "image/gif": $kiterjesztes = ".gif"; break;
case "image/png": $kiterjesztes = ".png"; break;
}
$nev = ekezettelenito($bejovonev);
$eredeti = $_FILES['kep']['name'];
$ideiglenes = $_FILES['kep']['tmp_name'];
$tipus = $_FILES['kep']['type'];
$hiba = $_FILES['kep']['error'];
$meret = $_FILES['kep']['size'];
$kiiras = "<p>A fájl tulajdonságai:</p>
<ul>
<li>név: {$nev}</li>
<li>típus: {$tipus}</li>
<li>ideiglenes név: {$ideiglenes}</li>
<li>hiba száma: {$hiba}</li>
<li>mérete: ".round($meret/1024)." KByte</li>
</ul>\n";
move_uploaded_file($ideiglenes, "../kepek/nagykepek/{$nev}{$kiterjesztes}");
$new=142;
$picture="../kepek/nagykepek/{$nev}{$kiterjesztes}";
switch ($kiterjesztes) {
case ".jpg": $orig=imagecreatefromjpeg($picture); break;
case ".gif": $orig=imagecreatefromgif($picture); break;
case ".png": $orig=imagecreatefrompng($picture); break;
}
list($width, $height) = getimagesize($picture);
$crop= ($width>$height) ? $height: $width;
$dest= imagecreatetruecolor($new,$new);
if($kiterjesztes=".png"){
imagecolortransparent($dest, imagecolorallocatealpha($dest, 0, 0, 0, 127));
imagealphablending($dest, false);
imagesavealpha($dest, true);
}
imagecopyresampled($dest, $orig, 0, 0, 0, 0, $new, $new, $crop, $crop);
switch ($kiterjesztes) {
case ".jpg": header('Content-Type: image/jpeg'); break;
case ".gif": header('Content-Type: image/gif'); break;
case ".png": header('Content-Type: image/png'); break;
}
switch ($kiterjesztes) {
case ".jpg": imagejpeg($dest,"../kepek/kiskepek/{$nev}{$kiterjesztes}"); break;
case ".gif": imagegif($dest,"../kepek/kiskepek/{$nev}{$kiterjesztes}"); break;
case ".png": imagepng($dest,"../kepek/kiskepek/{$nev}{$kiterjesztes}"); break;
}
}
else {
$kiiras = "<p><em>Érvénytelen fájlformátum vagy fájlnév!</em></p>\n";
}
}
$konyvtar = "../kepek/kiskepek/";
$tartalom = scandir($konyvtar);
$tipusok = array(".jpg", ".gif", ".png");
$kepek = "";
foreach ($tartalom as $fajl) {
if (in_array(substr($fajl, -4), $tipusok)) {
$kepek.= "<img src=\"{$konyvtar}{$fajl}\" alt=\"{$fajl}\" />\n";
}
}
?><!DOCTYPE html>
<html lang="hu">
<head>
<meta charset="utf-8" />
</head>
<body>
<?php if (isset($kiiras)) print $kiiras; ?>
<form method="post" action="" enctype="multipart/form-data">
<p>Név:<br />
<input type="text" id="nev" name="nev" /></p>
<p>Kép:<br />
<input type="file" id="kep" name="kep" /></p>
<p><input type="submit" id="ok" name="ok" value="Feltöltöm" />
</p>
</form>
<?php print $kepek; ?>
</body>
</html>
Hibakeresés
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.
Nem ez okozza a problémát, az
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.
Tehát javítottad az említett
Esetleg berakhatnád a jól működő változatot is (ha jól értem, hogy van olyan).
Mielőtt az if bekerült volna,
Nálam működik
if($kiterjesztes=".png"){
sort javítottam értékadásról összehasonlításraheader
hívásokat, lévén html-t akarsz megjeleníteni, nem képetmysql_real_escape_string
et (miért van ez egyáltalán benne?)Az összehasonlítást
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:
A header rész mit befolyásol?
RTFM? :)
Ö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 azif
teszteli ennek az értéknek az "igazságát" (ami minden esetbenTRUE
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. AContent-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 amysqli_*
vagy aPDO
függvények használatát, azon belül is a prepared statementeket (mysqli/PDO) és akkor nem kell bajlódnod amysql_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.
Köszönöm
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.
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:
Kipróbáltad a témanyitóban
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.
Kivettem a header részt és
de nem mindig értem meg a
Így, hogy magyarul sem értem
Akkor használj keresőt, de ha
Soronként végig kell menni a