Gå til innhold

[LØST] Bidlegalleri og mySQL


Anbefalte innlegg

Lurer litt på hvordan dere bygger opp ett bildegalleri, eller hva som er mest brukt/vanlig?

 

Laster dere opp til egne mapper pr. galleri?

eller samle alle bildene til 1 mappe, men har filnavnet til å begynne med gallerinavn.

 

Litt usikker på hvordan jeg skal komme i gang, så litt input hadde vjeg vert takknemlig for.

Endret av Yawa
Lenke til kommentar
Videoannonse
Annonse

Ikke bruk filnavn til å lagre data, slik som hvilket album/galleri bildet tilhører. Det er det man har databaser til. Hvis du ønsker at filnavnet skal være fint ved nedlastning, så finnes det andre måter for oppnå det. For å være mer spesifikk, så kan du lagre bilder med en numerisk ID etterfulgt av filendelse og deretter opprette en mod_rewrite-regel som gjør

 

http://..../2409824-bilder-fra-sommerferien.jpg

 

.. om til

 

2409824.jpg

 

Når det gjelder mappestruktur, så er det ingen ting i veien for å slenge en million filer sammen. NTFS støtter vel opptil 2^32 filer i én og samme mappe, hvilket burde være mer enn nok for de fleste. Å lage fancy mappestruktur vil ikke gi noen ekstra muligheter eller tilføre noe nyttig, og følgelig er det bare unødvendig.

Lenke til kommentar

ja riktig. skjønner litt.

Det som er, er at jeg skal kunne laste opp bilder fra en form da. (backend). Kun til bruk som visning på en galleri-side. sant.

Selve opplastingen er i orden. litt finpuss her og der gjenstår, men ellers så funker det.

 

 

Men har satt opp 2 databaser da. En album-database og en filer-database.

 

Jeg ønsker å ha det slik at jeg kan først gjøre ett av to ting:

#1 - opprette ett nytt album

#2 - benytte ett eksisterende album

 

Når man oppretter ett nytt album, så vil jeg jo ha litt relevant info til det.

Samme gjelder jo bildet. alt-text, tilhørende billedtekst, personer på bildet. etc.

 

Men står litt fast i selve utførelsen.

Første jeg prøvde på var å opprette en mappe pr. album. Med denne funskjnen (fungerer smell btw):

 

function create_album_folder ($f)
{
 global $err;
 $f = trim($f);
 if (empty($f)) { $err .= 'Du  må angi ett navn<br />'; return false; }
 elseif (strlen($f) < 3) { $err .= 'Album-navnet må være på minst 3 tegn (<em>bokstaver inkl. mellomrom</em>)<br />'; return false; }
 elseif (strlen($f) > 26) { $err .= 'Album-navnet kan <u>ikke</u> overstige 26 tegn (<em>bokstaver inkl. mellomrom</em>)<br />'; return false; }
 elseif (!preg_match('/^[A-Åa-å0-9 ]+$/', $f)) { $err .= 'Album-navnet kan kun inneholde bokstaver og tall (aA-åÅ og 0-9))<br />'; return false; }
 elseif (file_exists('/path/to/gallery/albums/'. $f)) { $err .= 'Album-navnet du forsøker å opprette eksisterer allerede.<br />'; return false; }
 elseif (!mkdir('/path/to/gallery/albums/'. $f , 0777)) { $err .= 'Beklager, men en feil oppstod. Album <u>ikke</u> opprettet.<br />'; return false; }
 else { return true; }
}

 

Kjører da dette scriptet:

if ($_POST['submit_album'])
{
 $rem = array('album' => ''. $_POST['album'].'', 'desc' => ''. $_POST['desc'] .'');

 if (!create_album_folder($_POST['album'])) { $rem; }
 else
 {
   $name = mysql_real_escape_string($_POST['album']);
   $date = mysql_real_escape_string($_POST['date']);
   $desc = mysql_real_escape_string($_POST['desc']);

   $query = sprintf ("INSERT INTO gallery (name, date, desc) VALUES ('$name', '$date', '$desc')");
   $result = mysql_query($query);

   print 'en ny mappe ble opprettet samt lagt til i databasen';
 }
}

else {}

 

Mapper blir opprettet da. men ingenting skrives til databasen... kan du, eller noen, se noe feil med det? har sjekket alt av navn etc. at det stemmer og sånt. Men klarer ikke se noe.

 

Men videre til slik du foreslår. kunne du forklart litt mer i "dybden" hva du anbefaler. og gjerne gi litt tips til hvor jeg kan starte?

Endret av Yawa
Lenke til kommentar

Har latt være den mappeløsningen. Blir bare unødvendig mye mapper etc.

 

 

Satt opp to tabeller her. En for album og en for bilder.

Så det jeg vil gjøre, er samme prinsippet. bare at jeg heller tildeler bildene en album-nøkkel. Sant.

 

Men, så er det hvordan jeg kan auto-generere ett filnavn da.

Begynnelsen av filnavnet ønsker jeg at skal bli galleriID'en. og sistedel av navnet vil jeg at skal starte på 00.

 

Så, si at jeg setter opp et nytt album da. Så har det nye galleriet fått ID'en: 0004

Så når jeg begynner å legge inn bilder, så legges bildenr. inn.

 

Tilslutt blir filnavnet: 000400.jpeg /.png /.gif

 

Det må jo bli en kommunikasjon mot databasen da på ett vis.

 

Som først sjekker om det er noen rader som har album-id'en 0004. Hvis ikke, så startes bilde på 00.

Hvis noen rader har album-id'en. så må det sjekkes hvor hva den siste bildet heter. eks. 09. så må det nye bilde hete 10.

 

alstå: 000410.

 

Var det forstålig? eller er det ikke slik man gjør det?

Lenke til kommentar

joda, sant det. Men det er for å få oversikt når man går inn i selve mappen. om nødvendig. Intet annet.

 

EDIT3: Da er akkurat denne problemstillingen løst. Men visning av bilde gjenstår.

Videre spørsmål i neste post.

 

EDIT1:

Men da har jeg fiklet endel i dag. Jeg har studert dette scriptet og bygget det litt om. Tilpasset det til mitt bruk.

Slik har det blitt så langt:

 

Funksjoner

<?php
//  Sjekker bildeteksten
function val_alt ($alt)
{
 global $err;
 $alt = trim($alt);
 $altLen = strlen($alt);

 if (empty($alt)) { $err = 'Du har ikke skrevet noen bildetekst'; return false; }
 elseif ($altLen < 3 || $altLen > 66) { $err = 'Bildeteksten må være mellom 3 og 66 tegn'; return false; }
 elseif (!preg_match('/^[A-Åa-å0-9 !\"&()?,;.:\-_]+$/', $alt)) { $err = 'Bildeteksten kan kun bestå av a-å, 0-9 og tegnene: ! " & ( ) ? , ; . : - _'; return false; }
 else { return true; }
}

//  Sjekker bildet som skal lastet opp
function val_img ($img, $tmp)
{
 global $err, $fileext;
 $img = stripslashes($img);
 $ext = get_ext($img);
 $ext = strtolower($ext);

 if (empty($img)) { $err = 'Du har ikke angitt noen fil'; return false; }
 elseif (!val_ext($ext)) { $err = '<em>.'.$ext. '</em> er ikke en godkjent bilde-filtype'; return false; }
 elseif (filesize($tmp) > 256000) { $err = 'Filen er for stor. Max er <u>250kb</u>'; return false; }
 else { $fileext = $ext; return true; }
}

   //  Skiller ut fil-endelsen
   function get_ext($str)
   {
     $dot = strrpos($str, '.');
     if (!$dot) { return false; }
     else
     {
       $Dot = strlen($str) -$dot;
       $ext = substr($str, $dot +1, $Dot);
       return $ext;
     }
   }

   //  Sjekker fil-endelsen
   function val_ext ($ext)
   {
     if (($ext != 'jpg') && ($ext != 'jpeg') && ($ext != 'png')) { return false; }
     else { return true; }
   }

//  Last opp godkjent bilde
function upl_img ($alb, $name, $ext, $tmp)
{
 global $err;
 $dir = '/path/to/gallery/';
 // "$alb" og "$name" hentes fra databasen for lettere oversikt også i mappestruktur.
 $img_name = $alb . $name .'.'. $ext;
 $new_name = $dir .'/'. $img_name;

 if (!copy($tmp, $new_name)) { $err = 'OBS! En feil oppstod. Bilde ble ikke opplastet'; return false; }
 else { return true; }
}
?>

 

Jeg kjører funksjonene gjennom dette scriptet:

Har kommentert det litt ut så det er noe lettere å forstå

<?php
if (isset($_POST['submit_upl_img']))
{
 // Først sjekker jeg om input'en er gyldig ved bruk av funksjonene
 if (!val_img($_FILES['img']['name'], $_FILES['img']['tmp_name']) || !val_alt($_POST['alt'])) {}

 //  Hvis input'en er gyldig, så skriver jeg tilhørende informasjon til databasen.
 else
 {
   $date = mysql_real_escape_string($_POST['date']);
   $alt = mysql_real_escape_string($_POST['alt']);
   $album = mysql_real_escape_string($_POST['album']);

   $query = sprintf("INSERT INTO gallery_picture (date, alt, album_id) VALUES ('$date', '$alt', '$album')");
   $result = mysql_query($query);

   // Sjekker om informasjonen ble vellykket skrevet til databsen
   if (!$result) { $err = 'OBS! Noe gikk galt ved skriving til databasen'; }

   // Hvis informasjon ble vellykket skrevet til databasen, så henter jeg ut album- og fil-ID'en igjen.
   // Dette for å bruke disse 2 ID'ene til å lage filnavnet på den opplastede filen.
   else
   {
     $filename = mysql_insert_id();

     $query = mysql_query('SELECT * FROM gallery_picture WHERE id = "'. $filename .'"');
     $getfi = mysql_fetch_assoc($query);

     // Hvis en feil skulle oppstå i forbindelse med opplasting av filen,
     // så slettes den tilhørende informasjon fra databasen igjen.
     if (!upl_img($getfi['album_id'], $getfi['id'], $fileext, $_FILES['img']['tmp_name']))
     {
       mysql_query('DELETE FROM gallery_picture WHERE id = "'. $filename .'"');
       $err = 'OBS! Noe gikk galt ved opplasting av bilde.';
     }

     // Hvis ingenting har gått galt på veien, så laster jeg opp bildet til serveren
     // og lar informasjoenn som ble skrevet til databasen værende.
     // Sender også ut en suksess-meling.
     else { $ok = 'Bildet ditt ble vellykket lastet opp med bilde-ID: '. $getfi['album_id'] . $getfi['id']; }
   }
 }
}

else {}
?>

 

Beklager lang post.

Men det som er nå da, er at jeg nå får validert bilde type og størrelse, gitt nytt navn til fil og lagret til server samt tilhørende informasjon til database. Med sammenhengende ID'er for lett oversikt. Som jeg ønsket.

 

 

Men det er jo noe som gjenstår:

Jeg vil endre størrelse, men beholde proposjoner, og lagre 2 bilder til serveren. (thumbs, og fullsize).

 

Bildene skal få identisk navn, bare lagres til 2 forskjellige mapper.

Så jeg må egentlig bare få lagt inn en resize-fuksjon en eller annen naturlig vei.

 

Det som er, er at den max-grensen jeg har satt, er beregnet på det endelige lagrete bildet.

Jeg søker det slik at en bruker kan laste opp et bilde på 3000x2000 og 4mb.

Men før bildet lagres, så blir det laget ett fullsize-bildet som blir redusert til max 768h/w samt max 256kb.

Og ett thumb-bildet som blir redusert til max 128h/w og max 96kb.

 

Så bildet som en bruker laster opp, må legges i ett minne til bilde er justert riktig for så å slettes. Eller er ikke dette vanlig?

 

Tipper uansett at det er lurest å vite hvor resize-funksjonen skal ligge før jeg går i gang å lager en med tanke på tilpasning. Eller?

 

> Kan noen gi meg litt veiledning til hvordan jeg kan få implentert en resize-funksjon i scriptet mitt?

 

En annen ting som også er ønskelig, men ikke ett must, er å kunne laste opp flere bilder samtidig. Som 3-5 stk. eks. Og at funksjoner etc. funker naturligvis.

 

 

Håper på noen gode svar...

 

EDIT2:

Har satt opp denne funksjonen, for resize til thumbs:

 

function create_thumb ($alb, $name, $ext)
{
 $image = '/path/to/gallery/'. $alb . $name .'.'. $ext;

 // DENNE biten må jeg ærlig si at jeg ikke forstår
 if(!strcmp("jpg",$ext) || !strcmp("jpeg",$ext)) $src_img=imagecreatefromjpeg($image);
 if(!strcmp("png",$ext)) $src_img=imagecreatefrompng($image);

 list($w, $h, $type, $attr) = getimagesize($image);

 $ratio_w = 128/$w;
 $ratio_h = 128/$h;
 $ratio = min($ratio_w, $ratio_h);

 $thumb_w = intval($ratio*$w);
 $thumb_h = intval($ratio*$h);

 $dst_img = imagecreatetruecolor($thumb_w, $thumb_h);
 imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $thumb_w, $thumb_h, $w, $h); 

 $thumb_name = '/path/to/gallery/thumb/'. $alb . $name .'.'. $ext;

 // DENNE biten må jeg ærlig si at jeg heller ikke forstår
 // om noen kunne forklart hadde det vert konge!
 if (!strcmp("png", $ext)) imagepng($dst_img, $thumb_name); 
 else imagejpeg($dst_img, $thumb_name); 

 imagedestroy($dst_img); 
 imagedestroy($src_img); 
}

 

Denne resizer til thumbs. Og holder proposjonene. samt lagrer filen. MEN! jeg får en feilmeldig til syvende og sist. Men det hele glir igjennom.

 

> Noen som kan se hvor det går galt i scriptet mitt?

Endret av Yawa
Lenke til kommentar

Da er selve opplastingsbiten oppklart. Etter mye fikling og mange død-timer gikk kabalen endelig opp.

 

Men, man støter på problemer rundt hvert hjørne virker det som. hehee.

Nå er det da å få printet dette ut igjen da. Det har jeg valgt å gjøre på denne måten:

 

<?php
 $id = mysql_real_escape_string($_GET['album']);

 $query_alb = sprintf('SELECT * FROM gallery_album WHERE id = \'%s\'', $id);
 $result_alb = mysql_query ($query_alb);
 $alb = mysql_fetch_assoc($result_alb);

 print '<h1>'. $alb['name'] .'</h1>';
 print '<p>'. $alb['desc'] .'</p>';

 $query_pic = sprintf('SELECT * FROM gallery_picture WHERE album_id = \'%s\'', $id);
 $result_pic = mysql_query($query_pic);
 $pic = '<div class="gallery_thumbs">';
 while ($tmb = mysql_fetch_assoc($result_pic))
 {
   list($x, $y, $t, $a) = getimagesize('/path/to/gallery/thumbs/'. $tmb['album_id'] . $tmb['id'] .'.'. $tmb['ext']);
   $pic .= '<img src="/path/to/gallery/thumbs/'. $tmb['album_id'] . $tmb['id'] .'.'. $tmb['ext'] .'" '. $a .' />';
 }
 $pic .= '</div><!--  .gallery_thumbs  -->';
 print $pic;
 print '<p> </p>';

 print '<div class="gallery_show">';
   // Når jeg klikker på ett av thumbsa overnfor, så var intensjonen å vise bilde i stort format her
   // Tidligere har jeg benyttet switch ($_GET['var']) her, da innholdet var ren HTML-koding.
   // Men nå som bildene skal hentes ut fra en database, så får jeg ikke skrevet CASE'a.
 print '</div><!--  .gallery_show  -->';

 

Problemet mitt ser dere i kommenteringen ovenfor.

URL'ene er som følgende (eks):

- Til galleriet: ?gdc=galleri

- Til ett gitt album: ?gdc=galleri&album=0246

- Videre til ett gitt bilde: ?gdc=galleri&album=0246&bilde=13579

 

Ikke at det må være slik, men det var det som fungerte tidligere.

 

Noen som har noe gode løsninger jeg kan prøve ut?

Lenke til kommentar
  • 2 uker senere...

Skjønte ikke helt hva du mente.

Er problemet at f. eks:

?gdc=galleri&album=0246&bilde=13579

"ikke finne"? :b

 

Du ønsker altså at galleri-visning skal fungere slik? (altså det er problemet?)

?gdc=galleri&album=".$data['album_id']."&bilde=".$data['pic_id']."

 

Dette er en simpel måte å gjøre noe slik på:

 

//index.php 

<?php

$gdc = $_GET['gdc'];
$photo = $_GET['photo'];
$album = $_GET['album'];

if (isset($gdc)) {
 if ($gdc == 'gallery') {
 echo "Welcome to the gallery";

   if (isset($album)) {
   echo "<br /> album";

       if (isset($photo)) {
       echo "<br /> Show photo";
       } 
   }
 } elseif ($gdc == 'home') {
   echo "hovedsiden";
 }
} else {
echo "nothing here..";
}

?>

 

Da blir linken til et bildet: ?gdc=gallery&album=1&photo=1

Men, i f. eks "photo", så vil den også vise alt som er i "gdc" samt bildet i photo.

Endret av slacky
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...