Avatar billede weeelo Nybegynder
16. november 2005 - 15:45 Der er 22 kommentarer og
2 løsninger

Automatisk navngivning af billeder.

Hejsa,

Jeg har fundet følgende spm. http://www.eksperten.dk/spm/571393.

Er der nogle der kan hjælpe mig med at få en automatisk navngivning af filerne på plads i det system?

Jeg havde selv overvejet noget med at bruge en database til at tælle filnavne og antal af filer.

Dvs. den første uploadede fil hedder 1, den næste 2 osv.

Er der nogle bedre forslag, eller skal jeg fortsætte med min idé?
Avatar billede jakobdo Ekspert
16. november 2005 - 16:02 #1
Du kunne lave følgende:
Når en fil uploades til en mappe, så kunne du navngive dem som:
$filename = md5(uniqid(rand(), true)) . ".jpg";

Og så smide det i en database, hvor ID = int auto_increment.
Så vil numre blive fortløbende.
Avatar billede jaw Nybegynder
16. november 2005 - 16:13 #2
Hvis du smider det i en database er id'et vel i sig selv måske også nok? Du kan få id'et, umiddelbart efter indsættelse ved at bruge mysql_insert_id();

Du kan så f.eks. få navnet:
$filnavn = mysql_insert_id().".jpg";
Avatar billede weeelo Nybegynder
16. november 2005 - 16:13 #3
Hvis jeg blot benytter:

$filename = md5(uniqid(rand(), true)) . ".jpg";

og 45bd3d656d27b09ac13ed45d6d119d5f.jpg f.eks. er blevet gemt, kan billedet så risikerer at blive overskrevet senere?

Kan se det er random, men tænkte på om true måske betød, at det skulle være et nyt?
Avatar billede weeelo Nybegynder
16. november 2005 - 16:16 #4
Funktionen behøves ikke at køre over en database, faktisk vil jeg gerne undgå det - det fik jeg måske ikke udtrykt godt nok. Eller er det bare nemmere gennem en db?
Avatar billede jakobdo Ekspert
16. november 2005 - 16:27 #5
Du vil bestemt blive glad for at have info i en database i længden!
F.eks. sortering...
Avatar billede weeelo Nybegynder
16. november 2005 - 16:34 #6
Ja, ok. Det har du nok ret i. Men sørger funktionen selv for ikke at overskrive allerede eksisterende billeder?
Avatar billede jakobdo Ekspert
16. november 2005 - 18:31 #7
Altså databasen vil med auto_increment altid lave et nyt nummer.
Så hvis du bruger jaw's løsning, hvor du først sætter noget i db, og derefter navngiver filen.
Avatar billede weeelo Nybegynder
16. november 2005 - 18:38 #8
Hvis jeg blot benytter $filename = md5(uniqid(rand(), true)) . ".jpg"; vil der så kunne ske det, at et billede bliver overskrevet?
Avatar billede jakobdo Ekspert
16. november 2005 - 18:41 #9
Teoretist ja!
Men chancen er MEGET lille.
Avatar billede weeelo Nybegynder
16. november 2005 - 18:50 #10
Hehe, hvor er jeg blank - den er selvfølgelig minimal..

Smid et svar, så får du point..
Avatar billede jaw Nybegynder
16. november 2005 - 18:52 #11
Du kunne også bruge
$filename = md5(time());
...så skal du uploade 2 filer på samme sekund for at få samme navn - ikke tænkeligt :)
Avatar billede weeelo Nybegynder
16. november 2005 - 18:57 #12
Det sker næppe, takker.

Jeg ved ikke om i vil dele eller hvordan, men jeg benytter i hvert fald jaw's forslag.
Avatar billede jakobdo Ekspert
16. november 2005 - 19:10 #13
jaw: to filer på samme tid?
Jeg ved hvad du mener, men rent teknisk kan 2 forskellige filer med 2 forskellige tidspunkter jo godt genere samme md5 sum.
Avatar billede weeelo Nybegynder
16. november 2005 - 19:12 #14
Så den er heller ikke unik? Men så længe sandsynligheden for at ramme samme filnavn en allerede oprettet fil er så minimal betyder det ikke noget.

Med mindre I kan hive en fjer op ad hatten omkring denne måde at gøre det på?
Avatar billede jaw Nybegynder
16. november 2005 - 19:25 #15
Kan det? Hvordan det? Muligt du har ret, så meget har jeg ikke sat mig ind i md5.
Avatar billede jakobdo Ekspert
16. november 2005 - 19:34 #16
Ja, det kan det godt! :o)
Hvis vi tager et meget simpelt eksempel:
Vi siger md5 returner checksum a-z, eller 0-9!
Altså har vi 36 muligheder.
Laver vi 37 filer, vil der kun være 36 mulige checksumme!
Ergo må en af dem være ens!
Det er jo lige så med md5, omend chancen er MEGET lille!
Avatar billede jaw Nybegynder
16. november 2005 - 19:56 #17
Nå jow, men rækkefølgen er jo ikke ens. Det må vel være 37 x 36 x 35 x 34 x 33 ... x n muligheder? :)
Avatar billede xyborx Nybegynder
18. november 2005 - 00:34 #18
Jeg vil nu nok mene at det er sikrest at tage auto_increment id'et fra databasen. Der er du 100% sikker på at navnene aldrig vil overlappe.

Ang. md5(time()): På et velbesøgt site kan du vel godt risikere at to personer uploader hver deres billede indenfor samme sekund, og så har du et problem.. :) Der er ingen grund til at introducere race conditions hvis det kan undgås.
Avatar billede jakobdo Ekspert
18. november 2005 - 08:38 #19
Så kan man bruge md5(microtime)
Avatar billede weeelo Nybegynder
12. december 2005 - 12:19 #20
Hmm, der kom aldrig nogle svar her :)

Jeg endte med at bruge md5(time(), da funktionen bruges af meget få mennesker, der sjældent (aldrig) tilføjer noget på samme sekund :)

Vil de "skyldige" ligge svar? :)
Avatar billede jaw Nybegynder
12. december 2005 - 12:21 #21
Det må da vist inkludere mig, så vidt jeg husker :)
Avatar billede jakobdo Ekspert
12. december 2005 - 12:23 #22
Og hvis jeg er skyldig, så melder jeg mig også! :o)
Avatar billede weeelo Nybegynder
12. december 2005 - 12:27 #23
Jeg siger tak for hjælpen.. :)
Avatar billede jakobdo Ekspert
12. december 2005 - 12:27 #24
Takker for point!
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