Avatar billede Peter Praktikant
26. februar 2004 - 12:15 Der er 18 kommentarer og
2 løsninger

Overvejelser inden programmering af galleri i PHP.

Hej
Jeg er i gang med at programmere et galleri i php. Jeg har lavet et script der resizer et givent billede til den størrelse man giver med som parameter.
Planen var at jeg ville uploade mine billeder til en folder domæne/folder. Herefter ville jeg så tilføje alle filnavne til en tabel i MySQL hvor hver linje skulle indeholde information om, om der allerede er genereret en thumbnail, billede i 640*480, billede i 800*600.
Når så man går ind på domæne/folder/index.php tænkte jeg at den skulle genere en side ud fra tabellen med billeder. Hvis thumbnail er genereret skal den bare tage det gemte billede som f.eks ligger i domæne/folder/thumbs og vise det. Hvis ikke skal det genereres, vises og samtidigt gemmes i folder/thumbs. Når man så klikker på et billede skal det vises (genereres og gemmes hvis dette ikke er gjort). Tabellen skal så indeholde felter der fortæller om der er genereret thumbnail, 640*480 og 800*600 for det valgte billede.
Men vil dette være en smart måde at gøre det på? Har du et forslag til en smartere måde at gøre det på?

Og nu nogle overvejelser ang. initialisering. Jeg vil jo gerne have det så simpelt som muligt, tænkte på at man kunne lave et script som køres efter upload, dette skulle så tilføje filnavne for alle billeder i folderen til tabellen. Men er der en smartere måde at klare det på, kunne man evt. lave noget med at første gang index.php køres kalder den en php-fil som tilføjer alle filnavne til en tabel ved navn folder? Så når jeg skal uploade billeder, så skal jeg bare sørge for at mappen indeholder billederne i maks-opløsning, index.php og tomme mapper med navn thumbs, 640, 800 f.eks.
Kort sagt, er jeg helt i skoven med måden jeg griber det an på, hvis jeg er, hvordan skal det så gøres?
Avatar billede jakoba Nybegynder
26. februar 2004 - 12:55 #1
Du kunne evt lave en sytematik i navnene på de der billedfiler så du ikke behøver at rode så meget i databasen.

fx:
du starter med a have en god stor billedfil. lad os kalde den "snedronningen.jpg". når du ønsker at tage den fil med i galleriet gør du følgende:

1) opretter en række i databasen med filnavnet og evt anden info om det billde. hvilken/hvilke brupper det tilhører, hvornår det blev indsat, hvornår det blev tegnet, osv. Hvad du nu har brug for som extainfo. men du indsætter ikke et ord i databasen om om der er lavet thumbnail eller hvilke størrelser billedet er lavet is.

2) Til det laver du en regel og hvad filnavnene skal være for de forskellige størrelser billeder. fx:
  "snedronningen_tn.jpg"
  "snedronningen_800x600.jpg"
  "snedronningen_1280x800.jpg"
  "snedronningen_640x480.jpg"
  osv.

og når du så skal vise fx en thumbnailside tasger du filnavnet fra databasen klistere '_tn' i enden af navnet og spørger serveren om det billede findes. hvis det ikke findes laver du det-
  $filnavn_tn = implode( "", array_splice( explode( "." $filnavn ), 1, 0, array("_tn.") ) );
  if( ! file_exists ( $filnavn_tn ) ) {
      // den findes ikke så den skal laves
      generer_tn( $filnavn, $filnavn_tn );    // funktionen genererer en thumbnail
  }
      // så nu VED vi filen "snedronningen_tn.jpg" findes og
      // kan bruge den so thumbnail i galleriet.

Kuden er utestet, så der er sikkert suntaksfejl galore. men ideen skulle være klar.

mvh JakobA
Avatar billede Peter Praktikant
26. februar 2004 - 13:49 #2
jakoba > Har godt overvejet metoden, det er da klart en mulighed. Det vil vel egentligt være mere effektivt da man slipper for at slå lige så meget op i databasen.
Efter lidt overvejelser tror jeg at jeg vil følge din metode. Men jeg kan jo stadigvæk kalde filerne det samme men bare ligge dem i subfolders, det vil gøre det lidt mere overskueligt tror jeg.
Men så er det bare tabellen i databasen der skal oprettes og alle indgange skal tilføjes på en simpel måde. Men hvis jeg kun skal have filnavnene i databasen, så er det spørgsmålet om det overhovedet kan svare sig at bruge databasen. Har du en idé til hvordan jeg let kan initialisere alt dette, om det letteste simpelthen bare vil være at gennemløbe alle filnavne i folderen og vælge dem fra der hedder jpg eller jpeg og så lave thumbnails af dem osv. Lige umiddelbart ved jeg ikke hvad jeg ellers skal gemme af information for hvert enkelt billede.
Avatar billede jakoba Nybegynder
26. februar 2004 - 14:16 #3
Enig. mapper med forskellige navne er nemmere at holde rede i end den der 'konstruer et feltnavn' metode.

Når galleriet bliver stort er det næsten en nødvendighed at opdele i grupper, og der kunne informationen i databasen være nyttig. Men igen. også der kan man opnå det samme ved at lave en mappestruktur. Der er dog 2 ting der taler for databasen.
1) Det er besværligt at skulle flytte N forskellige billeder fra N forskellige foldere til N andre når du ombestemmer dig og beslutter billedet egentlig tilhører en anden gruppe.
2) Mange billeder kan tilhøre flere grupper (fx et billede af julemanden er både i gruppen 'julebilleder' og i gruppen 'billeder tegnet af Tegner Tegnersen'). Det er nemt at lave med en database, men svært med foldere.

men det er et valg, og sålænge galleriet ikke er for stort er folderne definitivt nemmere.

mvh JakobA
Avatar billede morpheus Nybegynder
26. februar 2004 - 14:20 #4
Jeg har, for noget tid siden, været igang med det samme.

Min fil struktur er således:
userpics/
        id/
            mappe1/
                  billede.jpg
                  billede2.jpg
            mappe2/
          id2/
etc...

Dog finder jeg det lidt tungt at bruge GD til dynemisk at lave thumbs, så jeg overvejer ImageMagick.
Avatar billede Peter Praktikant
26. februar 2004 - 14:28 #5
Jeg har sådan set allerede mange billeder, de ligger tilgængelige via genererede html-filer med thumbs og det hele, det jeg vil have er ikke meget anderledes udover at jeg gerne vil kunne give brugeren lov til selv at vælge opløsning imellem nogle forskellige opløsninger.
Så som det er nu har jeg måske 500 billeder i 20 mapper hvoraf nogle er undermapper.
Jeg ved ikke rigtigt om jeg vil flytte billeder fra gruppe til gruppe. Men jeg kan måske godt se at så ville en database være rimeligt handy, i hvert tilfælde lige så snart nogle billeder skal tilhøre flere grupper.
Det gør ikke så meget om det er nemt at lave, det skal bare være så smart som muligt når det er færdigt.
Det der bekymrer mig mest lige nu er hvordan jeg skal tilføje billederne til databasen, altså filnavnene. Jeg ville jo gerne have noget der foregår så automatisk som muligt, helst sådan at jeg bare skal uploade billederne til folderA og så klarer php'en resten med at tilføje billederne til databasen, måske skal man lige specificere hvilke grupper billederne tilhører, men kun en gang, altså ikke for hvert enkelt billede.
Avatar billede Peter Praktikant
26. februar 2004 - 14:30 #6
morpheus > Min filstruktur er på samme måde. Hvordan tilføjer du filnavne til databasen (hvis du da gør det). hvorfor synes du GD er tungt til at generere thumbs? Jeg genererer dem da bare med samme script som jeg bruger til at generere de større billeder.
Avatar billede morpheus Nybegynder
26. februar 2004 - 14:33 #7
DB struktur

CREATE TABLE images (
  ImgID int(11) NOT NULL auto_increment,
  ImgPath varchar(255) NOT NULL default '',
  ImgName varchar(255) NOT NULL default '',
  ImgNameConv varchar(255) NOT NULL default '',
  ImgOrgHeight int(11) NOT NULL default '0',
  ImgOrgWidth int(11) NOT NULL default '0',
  ImgType varchar(255) NOT NULL default '',
  ImgMemGal int(11) NOT NULL default '0',
  ImgOwner int(11) NOT NULL default '0',
  PRIMARY KEY  (ImgID)
) TYPE=MyISAM;

Det er data omkring det originale billede
Avatar billede Peter Praktikant
26. februar 2004 - 14:42 #8
Ok, men kan det svare sig at gemme info som orgHeight, orgWeidth og type? Det er jo info man kan få ved at kigge på det originale billede. hvad er ImgMemGal?
Hvordan tilføjede du så info til databasen? Jeg uploader via ftp, så alle billeder ligger i mappen. Hvis man uploader via html vil det jo ikke være noget problem at tilføje for hver enkelt billede der uploades. Men når det er via ftp kan jeg ikke rigtigt finde ud af hvordan det gøres smartest.
Avatar billede morpheus Nybegynder
26. februar 2004 - 15:14 #9
Jeg har lavet et interface, der så via nogen funktioner opretter og sletter dirs.
Billerne uploades via PHP's upload funktion.

ImgMemGal, bestemmer hvilket galleri billedet skal vises under
Avatar billede stalle Nybegynder
26. februar 2004 - 15:45 #10
Jeg har selv for ganske nyligt siddet og rodet med at lave et galleri - ja, arbejder løbende på det.

Jeg har lavet det således at galleriet er bygget op over flere albums - så mange man kunne ønske sig faktisk.

Da det er en lukket brugergruppe der har adgang til galleriet, har jeg lavet det således at billederne bliver gemt, ved upload, med en del information.

Brugerens id i databasen, album id og så _lille_ eller _stor_.
Har valgt kun at have to størrelser.

en fil med navnet: jalla.jpg, der bliver uploadet til album 3 af brugeren med id 5, kommer således til at se således ud:
5_3_lille_jalla.jpg
5_3_stor_jalla.jpg

Det bliver så tilføjet min database.

Udver det tilføjer brugeren en beskrivelse af billedet, ved upload.
Når billedet ligger i albummet, er der mulighed for at tilføje kommentarer.(Det vil sige at det er det jeg er igang med at lave pt.)

Næste udvidelse er så at hente EXIF info fra billederne, hvis der er nogen - men det er en gang ude i fremtiden...
Avatar billede Peter Praktikant
26. februar 2004 - 15:49 #11
stalle > Ok. Men det jeg mangler er at finde ud af hvordan jeg smartest tilføjer alle billederne til databasen når jeg uploader med ftp. Hvis jeg uploadede med php ville det jo ikke være det store problem, så er det jo bare at køre et script hver gang et billede uploades. Men jeg kan ikke helt finde ud af om jeg skal lave et script som pløjer hele filtræet igennem og tilføjer alle nye billeder til databasen eller om jeg skal ligge et script i hver enkelt mappe som så skal køres ved tiføjelser af billeder i den mappe. Eller om jeg skal gøre noget helt tredje.
Avatar billede stalle Nybegynder
26. februar 2004 - 15:52 #12
glemte at sige at det oprindelige billede også bliver omdøbt til fx 5_3_jalla.jpg.

I det tilfælde laver du da bare så den tjekker om filnavnet indeholder fx 5_3_

Indeholder filenavnet ikke det, laver den en ny...
Avatar billede stalle Nybegynder
26. februar 2004 - 15:55 #13
Jeg har faktisk før, lavet et script der laver thumbs af billederne i e given mappe - her gav jeg blot mine thumbs et "tn_" i starten af filnavnet - Når jeg så laver thumbs, så tjekker jeg om filnavnet starter med tn_, og gør det det, gør jeg ikke noget ved filen.
Avatar billede Peter Praktikant
26. februar 2004 - 16:13 #14
Mht at lave thumbs på en side, så burde det ikke være det store problem. Her skulle jeg bare kunne gå min database igennem og vælge alle de billeder med den rigtige sti, derefter gå i sti/thumbs/ for hvert billede og hive billedet frem hvis det er der, hvis det ikke er der skal det genereres og gemmes i sti/thumbs/.
Mit problem ligger meget mere i at få tilføjet alle filnavne og stier til databasen på en smart måde.
Du foreslår som jeg læser det, at jeg kigger alle de originale billeder igennem og ser om der for hvert enkelt findes en fil der starter med f.eks 5_3_, men det vil jo gøre at jeg skal scanne hele folderen hver gang siden vises. Det vil selvfølgeligt virke fint, men når jeg nu har en database med alt info kan jeg jo ligeså godt bare løbe igennem den og for hver enkelt indgang kigge i /thumbs/ efter billedet der skal vises.
Avatar billede stalle Nybegynder
26. februar 2004 - 16:26 #15
Jeg foreslår ikke at du gør det hvor gang siden vises, men hver gang du har uploadet noget.

Altså:
Upload af billeder
Køre script til generering af thumbs / smide i database.
Slut
Avatar billede jakoba Nybegynder
26. februar 2004 - 16:44 #16
Hvad med a lave en mappe med uregistrede billeder, og så altid uploade nye billeder til den mappe.

Så kan du lave et script der lister billeder fra den mappe og lader dig skrive altmulig anden info om dem. For hvert billede bliver billedet så flyttet ind i den rigtige mappe samtidig med at der oprettes en database entry om det billede.

Det vil samtidig gøre det nemmere at holde rede i hvile billeder der er nye og hvilke der allerede er registreret.

mvh JakobA
Avatar billede Peter Praktikant
26. februar 2004 - 17:58 #17
stalle > Ja, det har jeg også overvejet som en mulighed. Så vil det jo sådan set bare være at smide et script i en mappe hvor man kan give stien til billederne der skal tilføjes eller lign. Det vil nok være den bedste måde da man så kan beskytte filen med password.

jakoba > Det er vist ikke lige en løsning der passer så godt til mine behov. Jeg uploader som regel en hel mappe af gangen hvor alle billederne hører sammen, f.eks er alle billederne taget til en bestemt fest. Jeg ligger dem så i en bestemt folder hvori de skal blive liggende.

Alternativt kunne jeg jo lave et script der kører igennem alle mapper rekursivt og tilføjer til databasen hvis de ikke allerede er tilføjet, hvis dette script kun køres i forbindelse med upload er det jo ikke det store problem.
Men jeg har meget svært ved at finde ud af hvad der er smartest, så jeg ville gerne vide hvad andre som har et galleri gjorde, altså andre der uploadede en hel mappe af gangen.
Avatar billede Peter Praktikant
18. marts 2004 - 10:47 #18
Nu skal spørgsmålet lukkes, jeg er stadigvæk ikke sikker på hvordan jeg vil opbygge det, men synes jeg er kommet tættere på.
Hvis i alle tre vil ligge et svar, så får i nogle point.
Avatar billede jakoba Nybegynder
19. marts 2004 - 07:20 #19
ok. takker
Avatar billede Peter Praktikant
06. maj 2004 - 18:47 #20
Da de andre ikke ville svare synes jeg vi skal dele pointene jakoba
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester