Image Gallery script v2.0

empty 27.12.03 17:54

Seuraava versio edellisestä versiosta. Nyt ominaisuuksia: kuvia voi selata myös alihakemistoista, kansio & error ikonit jossei kuvaa voi lukea, sivujen/kuvien listaus ym ym..

 Tekstiversio  Arvo: 3 (8 ääntä)  Äänestä: +  -
Ohje: laita scriptit kansioon jossa kuvat on ja tee kansioon thumbs niminen kansio ja varmista että www-serveri voi kirjoittaa sinne. Varmista myös että sinulla on $dirfile ja $errfile kuvakkeet, ja palvelimella GD tuki

---[ conf.php ]---
<?php
$dsize = 120;         // Thumbin koko pixeleinä. ($dsize x $dsize)
                                // Thumbnailien värit pitää muokata thumbs.php tiedostosta
$dirfile = "kansio.png";        // Kansion kuvake
$errfile = "virhe.png";  // Virhe kuvake

$title = "Image Gallery script v2.0 By. Evolius"; // Sivun otsikko
$sarakkeita = 5; // Kuinka moneen sarakkeeseen kuvat jaetaan
$kuvia = 20; // Kuinka monta kuvaa per sivu
$imgfile = "kuva.php"; // Kuvan katselutiedoston polku
$index = "index.php"; // selaajan polku
?>

---[ $index ]---
<?php
include("conf.php");
if(isset($_GET["start"])) { $alku = $_GET["start"]; } else { $alku = 0; }
$loppu = $alku+$kuvia;
if((isset($_GET["dir"])) && (is_dir($_GET["dir"]))) {
  $dir = $_GET["dir"];
  if(strstr($dir, "..")) { $dir = "."; }
  else {
    while(strstr($dir, "//")) { $dir = str_replace("//", "/", $dir); }
    if(substr($dir, strlen($dir)-1) == "/") { $dir = substr($dir, 0, strlen($dir)-1); }
    $pois1 = split('/', $dir);
    $pois = $pois1[sizeof($pois1)-1];
    $back = str_replace($pois, '', $dir);
    $parstr = '<p align="left"><a href="?dir='.$back.'">Parental Directory</a>';
  }
}
else { $dir = "."; }

$ii = 0;
clearstatcache();
if($a = opendir($dir)) {
  while($b = readdir($a)) {
    if(!(ereg("^\\.",$b))) {
      if($dir != ".") {
        $path = $dir.'/'.$b;
        while(strstr($path, '//')) { $path = str_replace('//', '/', $path); }
      }
      else { $path = $b; }
      if(($path != "thumbs") && ($path != $dirfile) && ($path != $errfile)) {
        if((is_dir($path)) && ($path != $thumbdir)) { $item[$ii] = $path; $ii++; }
        else {
          $kuva = getimagesize($path);
          if(($kuva[2] == 1) || ($kuva[2] == 2) || ($kuva[2] == 3)) { $item[$ii] = $path; $ii++; }
        }
      }
    }
  }
}

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Image Gallery script v2.0 By. Evolius</title><link rel="stylesheet" href="tyyli.css" type="text/css"></head><body margintop="0" marginwidth="0" marginheight="0"><p align="center"><table align="center"><tr><td>
<?php
echo "<p class=\"title\" align=\"center\">$title</p>".$parstr.'<table align="center" cellpadding="10" cellspacing="5"><tr>';
$td = 1;
for($i = $alku;$i < $loppu;$i++) {
  $file1 = explode("/", $item[$i]);
  $file = $file1[sizeof($file1)-1];

  // ottamalla seuraavat // merkit pois saat kuvien & kansioiden nimet näkyviin kuvan alle
  $name = "<br>$file";

  if(is_dir($item[$i])) {
    echo "<td valign=\"top\"><center><a href=\"".$index."?dir=".$item[$i]."\"><img src=\"thumb.php?".$item[$i]."\"></a>$name<br>(Directory)</center></td>";
  }
  elseif(is_file($item[$i])) {
    echo "<td valign=\"top\"><center><a href=\"".$imgfile."?img=".$item[$i]."\"><img src=\"thumb.php?".$item[$i]."\"></a>$name</center></td>";
  }
  if($td == $sarakkeita) { echo "</tr><tr>"; $td = 1; }
  else { $td++; }
}
if($td != 1) { echo "</tr>"; }
echo '</table><p align="center">';

if($alku != 0) {
  $alotus = $alku-$kuvia;
  if($alotus < 0) { $alotus = 0; }
  echo "<a href=\"$index?start=$alotus&dir=$dir\"><-Previous</a> ";
}
$ssivu = @floor($alku/$kuvia)+1;
$ssivut = @floor($ii/$kuvia)+1;
echo " ( ";
for($s = 1;$s <= $ssivut;$s++) {
  if($s == $ssivu) { echo " <b>$s</b> "; }
  else { $ala = ($s-1)*$kuvia; echo " <a href=\"$index?start=$ala&dir=$dir\">$s</a> "; }
}
echo " ) ";
if($loppu < $ii) { echo " <a href=\"$index?start=$loppu&dir=$dir\">Next-></a>"; }
?>
</td></tr></table>
</body></html>

---[ $imgfile ]---
<?php
if(strstr($_GET["img"], "..")) { die("!!!"); }
  include("conf.php");
  if(isset($_GET["img"])) {
    if(is_file($_GET["img"])) {
      $imgstr = '<p align="center"><img src="'.$_GET["img"].'"><p align="center">';
    }
  }
  else { header("Location: http://vesikupla.com/~jouni/Gallery/".$index."?dir".$_GET["from"]); }

  $kuva = $_GET["img"];
  while(strstr($kuva, "//")) { $kuva = str_replace("//", "/", $kuva); }
  $kuva1 = split('/', $kuva);
  $pois = $kuva1[sizeof($kuva1)-1];
  $dir = str_replace($pois, '', $kuva);
  if(substr($dir, strlen($dir)-1) == "/") { $dir = substr($dir, 0, strlen($dir)-1); }
  if($dir == "") { $dir = "."; }
  $ii = 0;
  clearstatcache();
  if($a = opendir($dir)) {
    while($b = readdir($a)) {
      if(!(ereg("^\\.",$b))) {
        if($dir != ".") {
          $path = $dir.'/'.$b;
          while(strstr($path, '//')) { $path = str_replace('//', '/', $path); }
        }
        else { $path = $b; }
        if(($path != $dirfile) && ($path != $errfile)) {
          if(is_file($path)) {
            $kuva = @getimagesize($path);
            if(($kuva[2] == 1) || ($kuva[2] == 2) || ($kuva[2] == 3)) {
              if($b == $pois) { $inum = $ii; }
              $item[$ii] = $path; $ii++;
            }
          }
        }
      }
    }
  }
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Image Gallery script v2.0 By Evolius</title>
<link rel="stylesheet" href="tyyli.css" type="text/css">
</head>
<body margintop="0" marginwidth="0" marginheight="0">
<p align="center"><table align="center"><tr><td>
<?php
$start = floor(($inum+1)/$kuvia)*$kuvia;
echo "<p align=\"left\"><a href=\"$index?dir=$dir&start=$start\">Back</a>";
echo $imgstr;
if($inum != 0) { echo "<a href=\"$imgfile?img=".$item[$inum-1]."\"><-Previous</a> "; }
for($i = 0;$i < $ii;$i++) {
  if($inum == $i) { $num = $i+1; echo " <b>$num</b> "; }
  else { $num = $i+1; echo " <a href=\"$imgfile?img=".$item[$i]."\">$num</a> "; }
}
if($inum+1 < $ii) { echo "<a href=\"$imgfile?img=".$item[$inum+1]."\">Next-></a> "; }
?></td></tr></table>
</body>
</html>

---[ thumb.php ]---
<?php

  /*  Copyright Evolius // Jouni kuusisto
   *  Täältä Kannattaa muokata vainthumbien värit, Josset tiedä mitä teet
   */

include("conf.php");
function pngThumbnail($file) {
  global $dsize;
  global $dirfile;
  global $errfile;

  if (function_exists('imagecreatetruecolor')) { $im = imagecreatetruecolor($dsize, $dsize); }
  else { $im = imagecreate($dsize, $dsize); }

  // Tästä voit siis muokata värit jos osaat :)
  $background = imagecolorclosest ( $im, 255, 255, 255);        // Tausta
  $frame1 = imagecolorclosest ( $im, 198, 199, 198);        // Frame1
  $frame2 = imagecolorclosest ( $im, 132, 134, 132);       // Frame2
  $frame3 = imagecolorclosest ( $im, 0, 0, 0);    // Frame3
  imagefilledrectangle ( $im, 0, 0, $dsize, $dsize, $background);

  $size = @getimagesize($file);
  switch($size[2]) {
    case 2:
      $si = imagecreatefromjpeg($file);
      break;
    case 3:
      $si = imagecreatefrompng($file);
      break;
    case 1:
      if (function_exists('imagecreatefromgif')){
        $si = imagecreatefromgif($file);
        break;
      }
    default:
      $file = $errfile;
      $size = @getimagesize($file);
      $si = imagecreatefrompng($file);
      break;
  }
  $im_w = $size[0]; $im_h = $size[1];
  if(($im_h < $dsize) && ($im_w < $dsize)) {
    $dw = $im_w;
    $dh = $im_h;
    $dx = floor(($dsize - $dw)/2);
    $dy = floor(($dsize - $dh)/2);
  } elseif ( $im_w > $im_h ) {
    $dx = 0;
    $dw = $dsize;
    $dh = floor($dsize * $im_h/$im_w);
    $dy = floor(($dsize - $dh)/2);
  } else {
    $dy = 0;
    $dh = $dsize;
    $dw = floor($dsize * $im_w/$im_h);
    $dx = floor(($dsize - $dw)/2);
  }

  if (function_exists('imagecopyresampled')) { imagecopyresampled( $im, $si, $dx, $dy, 0, 0, $dw, $dh, $im_w, $im_h); }
  else { imagecopyresized( $im, $si, $dx, $dy, 0, 0, $dw, $dh, $im_w, $im_h); }

  imagerectangle ( $im, -1, -1, $dsize-2, $dsize-2, $frame1);
  imagerectangle ( $im, 0, 0, $dsize, $dsize, $frame2);
  imagerectangle ( $im, -1, -1, $dsize-1, $dsize-1, $frame3);

  imageinterlace($im, 1);
  imagepng($im);
  if(!(is_dir("thumbs"))) { mkdir("thumbs"); }
  imagepng($im, 'thumbs/'.str_replace('/', '´´', str_replace('\\', '``', $file)));
  imagedestroy($im);
  imagedestroy($si);
  exit();
}

if (isset($_SERVER['QUERY_STRING']) && ($_SERVER['QUERY_STRING'] !== '')) {
  $file = $_SERVER['QUERY_STRING'];
  $regs = array();
  while (ereg('%[0-9]{2}', $file, $regs)) {
    $file = str_replace($regs[0], chr(hexdec($regs[0])), $file);
  }
  if(is_dir($file)) {
    $i = 0;
    $dir = opendir($file);
    while($b = readdir($dir)) {
      $koko = @getimagesize($file."/".$b);
      if(($koko[2] == 1) || ($koko[2] == 2) || ($koko[2] == 3)) { $file = $file."/".$b; $i++; }
    }
    if($i == 0) { $file = $dirfile; }
    $icon = $dirico;
  }
  $file2 = str_replace('/', '´´', str_replace('\\', '``', $file));
  if(is_file('thumbs/'.$file2)) {
    $im = imagecreatefrompng('thumbs/'.$file2);
    imagepng ($im);
    exit();
        }
  elseif (is_readable($file)) {
    pngThumbnail($file);
    $icon = $imgico;
    exit();
  }
  else {
    pngThumbnail($errfile);
    $icon = $imgico;
    exit();
  }
}
exit();
?>

---[ Esimerkki CSS -tyyli tiedostosta ]---
a:link, a:active, a:visited {
  color: #D6982D;
  text-decoration: underline;
}
a:hover {
  color: #FFA100;
  text-decoration: none;
}
body {
  font-family: verdana;
  font-size: 10px; color: #D6982D;
  margin: 20px;
  background: #FFFFFF;
}
p {
  margin: 5px;
  margin-top: 0px;
  font-family: verdana;
  font-size: 10px; color: #D6982D;
}
td {
  font-family: verdana;
  font-size: 10px; color: #D6982D;
}
p.title {
  margin: 10px;
  margin-top: 0px;
  font-family: arial;
  font-size: 20px; color: #D6982D;
}
img {
  border: 0px;
}
table {
  border-top: 1px solid #FFFFFF;
  border-bottom: 1px solid #FFFFFF;
}

Sointu 02:38 29.12.03 
Hyväntuntuinen galleria, mutta en saa pikkukuvia näkyviin. Eli thumbit ja tekstit tulee, mutta kuvat puuttuu. Kansion kuvake ei myöskään näy. Kuvat ja kansiot kyllä aukeaa "kuvattomista" kynsistä.
Sitten pieni korjaus:
---[ $imgfile ]--- :n (kuva.php ??? ) lopussa pitäisi olla </td></tr></table>
Nyt siinä on </td></tr></td>

empty 15:37 29.12.03 
Totta :)
Se että sinulla ei toimi johtuu todennäköisesti ettei palvelimella ole GD tukea :) sekin tietysti olisi pitänt mainita..
Sointu 19:54 29.12.03 
GD
GD Support enabled
GD Version 1.6.2 or higher
FreeType Support enabled
FreeType Linkage with freetype
JPG Support enabled
PNG Support enabled
WBMP Support enabled

Eli tuollaisen vastauksen antaa palvelimen phpinfo. Jonkinlainen tuki näyttäisi olevan, mutta eikö tuo riitä? :(
hikke 22:25 29.12.03 
Muuten kiva scripti, mutta koitat ajaa getimagesize-funktiota kaikille tiedostoille kuva.php-tiedostossa rivillä 30. Noh tuosta seurasi ainakin minulla ikävä virheilmo php:lta, mutta se oli helppo korjata. Toinen ominaisuus scriptillä on se, että se tekee aina png-muotoisia kuvia thumbeista, mutta tiedostonimeksi voi tulla .jpg-päätteinen joka ei ole kovin siistiä :)
hikke 22:57 29.12.03 
Hmm, tuo monen sivun systeemi on näyttäen kanssa buginen, <- previous näyttäisi aina olevan alottavan ihan alusta kun sinulla on:
if($alku != 0) {
$alotus = $alku-$kuvia;
if($alotus < 0) { $alotus = 0; }
echo "<a href=\"$index?start=$alotus&dir=$dir\"><-Previous</a> ";
}

..eli tuon mukaan $alotus on joko nolla tai negatiivinen luku :>

Sitten vielä toinen "ominaisuus", eli jos kuvia näytetään sivulla aina 20kpl ja kansiossa on tasan 40kpl kuvia/hakemistoja niin se tekee kolme sivua, ja viimeisellä ei ole mitään ;)
hikke 22:59 29.12.03 
Anteeksi. Voisi harkita testaamista ennenkuin kirjoittelee tänne, tuohan on ihan oikein :P
hikke 23:00 29.12.03 
Eikun olihan se väärin, edit/poisto omille kommenteille olis tarpeen nyt :P
hikke 23:02 29.12.03 
On se oikein ja nyt loppu tämä kommentointi ;)
empty 12:33 30.12.03 
Hmm.. huomasinpa juuri pienen ajatus virheen ja bugin tuossa sivujen listauksessa, Rivi:
$ssivu = @floor($ii/$kuvia)+1;
pitäisi siis olla:
$ssivu = @floor($alku/$kuvia)+1;
kun $ssivu:n pitäisi olla katsottava sivu, mutta nyt asia kuitenkin korjattu :)
empty 12:40 30.12.03 
Ja korjasin tuon hikke:n löytämän virheen kuva.php tiedoston 30. riviltä :)
ja Sointu, enpä ymmärrä miksi ei toimi, yritäppä katsoa pelkkä thumbnail kuva, eli thumb.php?kuva.jotain ja katso minkä virheen php antaa :) ja korjasin tuon sinun ilmoittaman virheen :)
hikke 22:10 30.12.03 
Ok, jos tänään olisin enemmän hereillä ;)

Mutta, tuo tekee edelleenkin 3 sivua jos kuvia on 40 ja 20 pitäisi näyttää aina sivulla. Ratkaisuna tähän oli $ssivut = @floor($ii/$kuvia)+1; korvaaminen $ssivut = @ceil($ii/$kuvia); lla.
ZupaDupa 17:08 1.1.04 
"Tästä voit siis muokata värit jos osaat :)"
Kuinkas näitä muokkaamalla saisi thumbnailit mustavalkoisiksi?
Juhis 03:56 18.1.04 
Eikö olisi järkevämpää käyttää ImageMagick:ia? Tällä tavoin voidaan käsitellä myös giffejä (joita GD ei tue) sekä monia muita.
www.imagemagick.org tuolla on listattuna tuetut formaatit. Muistaakseni yli 80.
empty 03:04 20.1.04 
oiskos tätä koodia jossakin nähtävillä käytössä elikkä minkä näköinen/tomiva se o oikeasti. kiinnostas hieman vertailla eri kyhäelmiä.
cAHVA 15:40 21.1.04 
Juhis: kyllä se GD tukee GIF-tiedostoja. Ehkä joskus muinoin ei tukenut mutta nyt nykyiset versiot pöhää kiukulla kihveleiden kanssa. Tietysti jos on taas kökkö-mbnetillä(olen huomannut että aika monella mureakuhalaisella on) sivusto niin ne ei toimi kun mbnet päivittää juttujansa kerran 5 vuodessa :D
D-Iivil 10:25 7.4.04 
Kertokaas tyhmälle kuinka tässä olisi mahdollista järjestää nuo hakemistosta löytyvät kuvat / alihakemistot aakkosjärjestykseen ennen sen tulostamista ruudulle?

Olisi varmasti monen muunkin mielestä varsin mukava funktio muuten loistavassa ja kevyessä scriptissä :)
D-Iivil 15:39 7.4.04 
Ratkaisu löytyi. Kuvat ja kansiot saatte näkymään aakkosjärjestyksessä lisäämällä:
sort($item);
reset($item);

Ennen seuraavaa riviä index.php-tiedostossa:
echo "".$parstr.'<table align="center" valign="top" cellpadding="5" cellspacing="5"><tr>';
Shaw 22:38 18.4.04 
Warning: is_dir() [function.is-dir]: Unable to access in /blaa/blaa/index.php on line 93

Warning: is_file() [function.is-file]: Unable to access in /blaa/blaa/index.php on line 96

Tällästä puskee tuohon sivulle jossa näkyy thumbit. Ja samaa myös tultaessa parental directoryyn ekalle thumbsivulle mistä pääsee eri kansioihin...
Makaveli 09:10 31.5.04 
Eikös tätä ole aika turvatonta käyttää, kun pääset tämän avulla käsiksi joka hakemistoon johon Apache-userilla on oikeudet. Vaikka:

index.php?dir=/etc/
index.php?dir=/home/kayttaja/public_html/
jne.
empty 18:15 7.10.04 
totta :E
3. versio on jo "valmis", kattoo missä vaiheessa viittin laittaa tänne.. se onkin melkee kokonaan uusiks tehty..
empty 14:36 3.1.05 
Sointu kirjoitti:
Hyväntuntuinen galleria, mutta en saa pikkukuvia näkyviin.

Minulla oli sama vika ja syyksi selvisi että conf.phpn lopussa oli väli ja rivinvaihto(tulostuu kuvatiedoston alkuun). Eli tiedostossa ei saanut olla "?>"n jälkeen enää edes rivinvaihoa. Eikä tietenkään tiedoston alussakaan... Sama pätee myös thumb.php:hen
jonezy 15:07 26.12.05 
Pitäisikös skriptin tallentaa nuo thumbit?
thumbs kansiolla oikeudet 666
Tinkeq 16:49 6.3.06 
Mitenkäs tämän saa näyttämään kaikki tiedostot... Esim. *.avi ja *.mpg tiedostot...
Tyyliin jollain kuvakkeella ja sitten saisi ohittaa tuon kuva.php:n silleen että jos on vaikka *.avi tiedosto niin lähtisi samantien lataamaan sitä videotiedostoa...

Julmuri 22:03 18.8.06 
Evolius kirjoitti:
Ja korjasin tuon hikke:n löytämän virheen kuva.php tiedoston 30. riviltä :)


Minulla taas tulee herjaa riviltä 32:

Warning: getimagesize(): Read error! in /var/www/virtual/tofi.mhosting.org/htdocs/galleria/galleria/2005syksy/index.php on line 32

En kyllä ymmärrä lainkaan mikä tässä mättää :(