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; }
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 ä -> ä , ö -> ö jne...
Koodin laittaja vois laittaa demon tästä.
Ite vähä muokkasin :) http://84.248.91.215/gallery/gallery.php
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.
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"...
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?
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ä.
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.
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...
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().
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.
Hyvä koodivinkki, tuli tarpeeseen!
mikäs funktio antaa uuden kuva leveyden ja korkeuden?
Miksi tuo luo kolme eri hakemistoa upload,kuvat ja thums?
Eikö pelkkä kuvat ja thums riitä vai mikä tuon upload kansion tarkoitus on?
Upload-hakemisto sisältää alkuperäisen, muokkaamattoman kuvan.
Toimii muuten mutta uploadettaessa tulee rumia ilmoituksia, vaikka kuva kyllä menee palvelimelle.
Horny: Millaisia ilmoituksia? Kristallipallo on hieman utuinen...
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.
Olisikohan kuva liian iso? PHP:ssä taitaa oletuksena olla 2Mt maksimi tiedostokoko upittaville tiedostoille.
Hyvä vinkki, eipä tuosta voi muuta sanoa :)
Tarpeen tulee ja säästää miettimisen vaivaa todella paljon itseltäni!
Kiitoksia
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?
Aihe on jo aika vanha, joten et voi enää vastata siihen.