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?
<?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>
 
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:
<?php

//$nev="asd2.jpg";
//$nev="asd2.png";
$nev="asd2.gif";

$new=142;

//$picture="111.jpg";
//$picture="asdasd.png";
$picture="xx.gif";

//$orig=imagecreatefromjpeg($picture);
//$orig=imagecreatefrompng($picture);
$orig=imagecreatefromgif($picture);

list($width, $height) = getimagesize($picture);

$crop= ($width>$height) ? $height: $width; 

$dest= imagecreatetruecolor($new,$new);

imagecopyresampled($dest, $orig, 0, 0, 0, 0, $new, $new, $crop, $crop);

//header('Content-Type: image/jpeg');
//header('Content-Type: image/png');
header('Content-Type: image/gif');

imagejpeg($dest,"../kepek/kiskepek/{$nev}");

?>
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:
<?php
$nev="asd2.jpg";
//ikonméret
$new=142;
//kép forrása
$picture="xx2.jpg";
$orig=imagecreatefromjpeg($picture);
//kép nagysága
list($width, $height) = getimagesize($picture);
/*if ($width>$height) print "Fekvő";
elseif ($width<$height) print "Álló";
else print "Négyzet";*/
//kivágási méret
$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
//képvászon létrehozása
$dest= imagecreatetruecolor($new,$new);

//kép kivágása
imagecopyresampled($dest, $orig, 0, 0, 0, 0, $new, $new, $crop, $crop);
//jpg kép előállítása a böngésző miatt?
header('Content-Type: image/jpeg');

imagejpeg($dest,"../kepek/kiskepek/{$nev}");

?>
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.