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ásraheaderhívásokat, lévén html-t akarsz megjeleníteni, nem képetmysql_real_escape_stringet (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 azifteszteli ennek az értéknek az "igazságát" (ami minden esetbenTRUElesz).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-typefejlé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_stringA
mysql_*függvények használata helyett (lévén elavultak) ajánlom amysqli_*vagy aPDOfüggvények használatát, azon belül is a prepared statementeket (mysqli/PDO) és akkor nem kell bajlódnod amysql_real_escape_stringhaszná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