Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Kuvagalleria ja upload

Sivun loppuun

Tinqe [30.07.2006 21:47:32]

#

Yksinkertainen PHP-kuvagalleria, luo automaattisesti thumbnailit kuvista. Tukee JPEG, GIF ja PNG -kuvia, vaatii GD-kirjaston toimiakseen. Näytettäessä yksittäinen kuva, näyttää kuvasta tietoja. Muutettu kuvien koon muuttaminen omaksi funktiokseen ja kuvan tietojen hakuun toinen funktio, molemmat sijaitsevat func_gallery.php -tiedostossa.

gallery.php

<html>
<head><title>Galleria</title></head>
<body><?php
/* gallery.php
Luo hakemistot upload, kuvat, thumbs ja niille kirjoitusoikeudet
Käyttö omalla vastuulla, muokkaaminen sallittu ja jopa suotavaa.
Koodailija: Tinqe
( #kumilenkki @ QuakeNet | tinqe (a) kumilenkki.com )
Versio 0.2
*/
// Muutettavat arvot
$conf_maxfilesize = 1024; // kt
$tmb_max_w = 160; // Thumb-kuvan max-leveys
$tmb_max_h = 120; // Thumb-kuvan max korkeus
$img_max_w = 640; // Kuvan max leveys
$img_max_h = 480; // Kuvan max korkeus

// Tarvittavat funktiot
include('func_gallery.php');

// Tiedostokoko kt tavuiksi
$conf_maxfilesize = $conf_maxfilesize*1024;

// Tyhjä virheviesti
$error = '';

// Tiedoston lisäyslomake
print('<form enctype="multipart/form-data" action="gallery.php" method="POST">
	<input type="hidden" name="MAX_FILE_SIZE" value="'.$conf_maxfilesize.'">
	Tiedosto: <input name="file" type="file">
	<input type="submit" name="submit" value="Send File">
	</form><b><a href="gallery.php?">Galleriasivu</a></b><br><br>');

if(isset($_POST['submit']))
{
	// Kuvan tiedot
	list($type,$ext,$width,$height) = image_information($_FILES['file']['tmp_name']);

	// Tarkastetaan tiedoston koko
	$file_check = TRUE;
	if($_FILES["file"]["size"] > $conf_maxfilesize)
	{
		$file_check = FALSE;
		$error = $error."Tiedosto on liian suuri!<br>";
		}
	elseif($_FILES["file"]["size"] == 0)
	{
		$file_check = FALSE;
		$error = $error."Tiedoston koko on 0!<br>";
		}
	if($file_check && $type)
	{
		$timestamp = time();
		// Tallennetaan thumbnail
			$destination_file = 'thumbs/'.$timestamp.'.'.$ext;
		create_resized_image($_FILES['file']['tmp_name'],$destination_file,$tmb_max_w,$tmb_max_h);
		// Tallennetaan muutettu kuva tiedostoon
			$destination_file = 'kuvat/'.$timestamp.'.'.$ext;
		create_resized_image($_FILES['file']['tmp_name'],$destination_file,$img_max_w,$img_max_h);
		// Tallennetaan alkuperäinen kuva
		move_uploaded_file($_FILES["file"]["tmp_name"], 'upload/'.$timestamp.'.'.$ext);
		print('Kuva tallennettu palvelimelle.');
		}
	else
	{
		// Virheviesti
		print($error);
		}
	}

// Jos halutaan näyttää yksi kuva, näytetään se
if(isset($_GET['i']) && is_file('upload/'.$_GET['i']))
{
	print('<img border="0" src="kuvat/'.$_GET['i'].'">');
	print('<br><a href="upload/'.$_GET['i'].'">Näytä alkuperäinen kuva</a>');
	$info =  image_information('upload/'.$_GET['i']);
	print('<br>Koko: '.$info[2].'x'.$info[3].'');
	$filesize = round($info[4]/1024);
	print('<br>Tiedosto: '.$filesize.'kt');
	}
// Jos kuvaa ei ole, näytetään virhe
elseif(isset($_GET['i']))
{
	print('<b>Kuvaa ei ole!</b>');
	}
else
{
	// Käydään kansion sisältö läpi ja luodaan lista kuvista
	$folder = opendir("thumbs/");
	//luetaan ensimmäisen tiedoston nimi
	$filename = readdir($folder);

	//jatketaan niin kauan kun $nimi ei ole false
	$col = 1;
	print('<table border="0"><tr>');
	while ($filename)
	{
		//tulostetaan tiedoston nimi
		if(is_file('thumbs/'.$filename))
		{
			// Tulostetaan taulukon solu
			print('<td width="200" align="center"><a href="gallery.php?i='.$filename.'"><img src="thumbs/'.$filename.'" border="0"></a></td>');
			if($col == 4)
			{
				// Jos rivillä on jo 4 kuvaa, aloita seuraava rivi
				$col = 0;
				print('</tr><tr>');
				}
			$col = $col+1;
		}
		//luetaan seuraavan tiedoston nimi
		$filename = readdir($folder);
		}
		if($col < 4)
		{
			// Jos viimeinen rivi jää vajaaksi, tee tyhjiä soluja ja lopeta taulukko
			print('<td> </td>');
			}
		print('</tr></table>');
	//suljetaan hakemisto
	closedir($folder);
	}
?>
</body>
</html>

func_gallery.php

<?php
/* func_gallery.php
 Gallerian funktiot
*/
function image_information($original_file)
{
	// Ottaa tarkistettavan tiedoston nimen ja tarkistaa sen tiedostopäätteen välittämättä tiedostonimestä, toimii kuville
	$type = getimagesize($original_file);
	$filesize = filesize($original_file);

	// Tarkistetaan tiedoston tyyppi
	if($type[2] == 1) // GIF
	{
		$file_extension = "gif";
		}
	elseif($type[2] == 2) // JPEG
	{
		$file_extension = "jpg";
		}
	elseif($type[2] == 3) // PNG
	{
		$file_extension = "png";
		}
	else // Tiedostomuoto ei ole tuettu, palauttaa FALSE
	{
		$file_extension = FALSE;
		}
	// Funktio palauttaa arvot, jos ok
	if($file_extension)
	{
		// palauttaa type,tiedostopääte,leveys,korkeus,tiedostokoko
		return array($type[2],$file_extension,$type[0],$type[1],$filesize);
		}
	else
	{
		// Tiedostotyyppi ei ole tuettu tai jotain häiriöö
		return array(FALSE,FALSE,FALSE,FALSE);
		}
	}

function create_resized_image($original_file,$destination_file,$resized_width,$resized_height)
{
	// Ottaa syötteenä vastaan (alkuperäinen tiedosto), (uuden kuvan hakemisto/tiedosto ilman päätettä), (uusi leveys), (uusi korkeus)

	// Selvitetään kuvan koko ja tyyppi
	list($original_width, $original_height, $type) = getimagesize($original_file);

	// Tarkistetaan tiedoston tyyppi
	if($type == 1) // GIF
	{
		$original_image = imagecreatefromgif($original_file);
			// Läpinäkyvyys -> valkoinen
			$white = imagecolorallocate($original_image, 255, 255, 255);
			$transparent = imagecolortransparent($original_image, $white);
		}
	elseif($type == 2) // JPEG
	{
		$original_image = imagecreatefromjpeg($original_file);
		}
	elseif($type == 3) // PNG
	{
		$original_image = imagecreatefrompng($original_file);
		}
	else // Tiedostomuoto ei ole tuettu, palauttaa FALSE
	{
		$type = FALSE;
		}
	if($type)
	{
		// Lasketaan kuvalle uusi koko siten, että kuvasuhde säilyy
		$new_w = $original_width/$resized_width; // Kuvasuhde: leveys
		$new_h = $original_height/$resized_height; // Kuvasuhde: korkeus
		if($new_w > $new_h || $new_w == $new_h)
		{
			if($new_w < 1)
			{
				// Jos alkuperäinen kuva on pienempi kuin luotava, luodaan alkuperäisen kokoinen kuva
				$new_w = 1;
				}
			// Käytetään sitä suhdetta, jolla tulee max. asetettu leveys, korkeus on alle max.
			$new_width = $original_width / $new_w;
			$new_height = $original_height / $new_w;
			}
		elseif($new_w < $new_h)
		{
			if($new_h < 1)
			{
				// Jos alkuperäinen kuva on pienempi kuin luotava, luodaan alkuperäisen kokoinen kuva
				$new_h = 1;
				}
			// Käytetään sitä suhdetta, jolla tulee max. asetettu korkeus, leveys on alle max.
			$new_width = $original_width / $new_h;
			$new_height = $original_height / $new_h;
			}
		// Luodaan kuva, joka on määrätyn kokoinen
		$image = imagecreatetruecolor($new_width, $new_height);
		// Resample, luo uuden kuvan tiedostoon
		imagecopyresampled($image, $original_image, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);

		// Tallennetaan uusi kuva määriteltyyn tiedostoon ja annetaan sopiva tiedostopääte
		if($type == 1) // GIF
		{
			imagegif($image, $destination_file);
			}
		elseif($type == 2) // JPEG
		{
			imagejpeg($image, $destination_file);
			}
		elseif($type == 3) // PNG
		{
			imagepng($image, $destination_file);
			}
	}
	// Poistetaan kuva muistista, ei tuhoa alkuperäistä tiedostoa!
	imagedestroy($image);
	// Palauttaa tiedostotyypin onnistuessaan, FALSE jos ei onnistu
	return $type;
	}

juha127 [09.08.2006 16:16:07]

#

Ihas kätsy, tuohonko vielä yhdistää muutaman putkan galleria, salaus scriptin niin... 8)
Itelläni ainakin uppasi kaikki ilmoittamasi tiedostomuodot, kun kokeilin jotain muuta, tuli virhe ilmoitus unlink:istä
Warning: unlink(/tmp/phpHaejoE) [function.unlink]: No such file or directory in /var/www/galleria/gallery.php on line 161
Ainoastaan ääkköset hieman kiusaavat, mutta hoituvat helposti ä -> &auml; , ö -> &ouml; jne...

Teippio [13.08.2006 18:28:52]

#

Koodin laittaja vois laittaa demon tästä.

juha127 [13.08.2006 22:32:50]

#

Ite vähä muokkasin :) http://84.248.91.215/gallery/gallery.php

Tinqe [22.08.2006 23:50:18]

#

Korjattu pari kohtaa:
Jos alkuperäinen kuva pienempi kuin thumbnail, ei suurenna thumbia.
Jos läpinäkyvä GIF, muuttaa taustan valkoiseksi. Ainakin pitäisi toimia.

juha127 [02.09.2006 22:02:14]

#

Missä kohtaa nuo korjaukset ovat, kun itse olen venyttänyt koodin n. 700 rivin mittaseksi ja copy -> paste kokokoodi ei toimi tässä.

Vielä, miten voinko laittaa muokkaamani putkan vinkiksi, kun se käyttää tätä kuvan tallennus "moottoria"...

SysRq868 [17.09.2006 15:01:58]

#

juha127: Luulen että se on ihan sallittua, kunhan se ei ole vain suora kopio johon olet lisännyt jotain pientä säätöä, ja kunhan vain annat alkuperäisen moottorin tekijälle vähän kredittiä (ehkä tekijän nimi ja linkki tähän vinkkiin?). En tosin ole varma. Parasta varmaankin kysyä Tinqeltä itseltään (tinqe@kumilenkki.com).

Tää on ihan hyvä koodi, tosin en älyä pikkukuvien teon järkeä, jos kerran kuvat on kuitenkin allekkain niin, että sitä joutuu scrollailemaan ihan hullusti. Ehkä väännät for-silmukalla jonkun taulukko/div -virityksen, jolla ne menisivät riveihin?

TeNDoLLA [18.09.2006 11:06:35]

#

Pikkukuvien teon järkevyys lienee piileneen mm. lataus ajoissa. Eli kun katsotaan thumbnaileja, ei ladata turhaan kaikkia isompi kokosia kuvia heti, vaan vain pienet kuvat. Ja sitten tarpeen mukaan iso kuva, kun kuva halutaan nähdä. Säästää lataus aikaa ja jos palvelimella on mahdollinen liikenne rajoitus, niin säästää myös liikennettä.

Tinqe [19.09.2006 09:24:13]

#

Sen kun teette koodilla mitä lystäätte. Itse tässä hieman yritän vielä parannella tuota vinkkiä, kunhan nyt ehdin.

Vinkin ideana olikin juuri kuvien lisäys ja pienennys, niiden esittäminen jää käyttäjän vastuulle.

Edit: Päivitin vinkkiä hieman, nyt pitäisi olla helpompi erotella itsensä tarvitsemat kohdat tuolta koodin seasta. Omat funktiot ovat eri tiedostossa, koska käytän niitä myös itselleni kehittelemässä galleriassa. Lisäsin myös kaipaamanne "monta kuvaa samalle riville" ominaisuuden.

juha127 [22.09.2006 22:51:56]

#

Nooh ite sain oman muokkaukseni toimimaan mielestäni täysin, mutta siinä on vielä korjaamasi pikkukuvien koko bugit. Koodi hirmu löytyy osoitteesta http://juha127.arkku.net/?sivu=galleriakoodi Siinä on pieniä tietoturva aukkoja, mutta...

Tinqe [23.09.2006 19:10:44]

#

Läpinäkyvyyden osuus, sekä kuvasuhteen laskeminen.
http://paste.servut.us/sv

Omasta koodistasi sen verran, että:
CREATE TABLE user -> CREATE TABLE users
ja

$kayttajia = mysql_numrows($haku) or die ("Virhe :".mysql_error());
// korvaa, ei galleria toimi jos ei käyttäjiä rekisteröityneenä
$kayttajia = mysql_num_rows($haku);

Adminin nick kannattaa varmaan heittää suoraan muuttujaan alussa, jolloin admin voi olla muutakin kuin "admin". Jos hienosti haluaa tehdä, niin useamman adminin saa käyttämällä in_array().

$admin_nick = "Admini";

if ($_COOKIE["foorum_nimi"] == "admin" AND $sisalla)
// Korvaa rivillä
if ($_COOKIE["foorum_nimi"] == $admin_nick AND $sisalla)

Techs [10.11.2006 15:09:31]

#

Miksihän mulla ei toimi tuo, vaikka suoraa kopsasin tuon. Sanoo vain:
Warning: opendir(thumbs/) [function.opendir]: failed to open dir: Invalid argument

EDIT: unohtakaa. Polku oli kaikesta huolimatta sittenkin väärin. Tosin nyt ei toimi thumbbien teko.

Tumpelo [18.03.2007 12:37:17]

#

Hyvä koodivinkki, tuli tarpeeseen!

JyKKemus [16.10.2007 07:44:30]

#

mikäs funktio antaa uuden kuva leveyden ja korkeuden?

lahna28 [24.01.2009 15:21:37]

#

Miksi tuo luo kolme eri hakemistoa upload,kuvat ja thums?
Eikö pelkkä kuvat ja thums riitä vai mikä tuon upload kansion tarkoitus on?

Tinqe [23.03.2009 20:11:45]

#

Upload-hakemisto sisältää alkuperäisen, muokkaamattoman kuvan.

Horny The Horrible [06.02.2010 17:49:55]

#

Toimii muuten mutta uploadettaessa tulee rumia ilmoituksia, vaikka kuva kyllä menee palvelimelle.

Tinqe [22.02.2010 19:54:02]

#

Horny: Millaisia ilmoituksia? Kristallipallo on hieman utuinen...

InfreQ [27.02.2010 18:31:28]

#

Uploadatessa valittaa tiedoston koon olevan nolla vaikka yritän lisätä kuvaa jonka koko on n. 5mb ja reso n. 2500x2000 mistä moinen ongelma? Ja mikä avuksi? Kokeilin myös saman kuvan lisäämistä demoon eikä onnistunut.

Tinqe [04.03.2010 18:01:19]

#

Olisikohan kuva liian iso? PHP:ssä taitaa oletuksena olla 2Mt maksimi tiedostokoko upittaville tiedostoille.

manninen [09.08.2011 09:44:38]

#

Hyvä vinkki, eipä tuosta voi muuta sanoa :)

Tarpeen tulee ja säästää miettimisen vaivaa todella paljon itseltäni!

Kiitoksia

jaakkosalmix [20.12.2011 15:59:55]

#

Nyt teen varmaan jotain väärin, kun tulee errori

Fatal error: Call to undefined function imagecreatefromjpeg() in /Volumes/Web/harjoitus/func_gallery.php on line 58

Pitääkö kuvakansiot olla samassa kansiossa gallery.php ja func_gallery.php tiedostojen kanssa? Vai mistäkö tuo johtuu?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta