15. oktober 2007 - 18:55Der er
18 kommentarer og 2 løsninger
uniktnavn til uploadede billeder
Jeg er ved at lave en upload funktion, men mangler lige et spark i den rigtige retining. Jeg ønsker at give alle billeder et unikt navn, men hvordan gør jeg det. Jeg har læst et sted at jeg kan give billedet navn efter hvilken dato og tid det bliver uploadet f.ek 15102007185322 (15/10 2007 kl. 18:55:22), men så er problemet hvis to brugere uploader et billede på samme tid. er der en som har et bedre bud på hvordan billedet kan omdøbes
olebole giver din løsning ikke samme problem som 15102007185322, hvis tiden og filnavnet er ens bliver en md5 af det vel også ens, men du hjalp mig på rette vej da jeg kan smide brugerens navn med også, så bliver det unikt.
Til Nielle Jeg registrere billedet i en tabel, men de bliver uploadet i samme mappe, så, det ene vil bare overskrive det andet.
Jo, du har ret i, at to billeder med samme navn får samme md5-hash - men kun, hvis de uploades indenfor samme sekund og hedder det samme. Nu skrev jeg godtnok $oldFileName - men du kan jo bare bruge $_FILES["tmp-name"] :)
- og det er absolut ikke fordi, jeg er uenig med nielle. Hvis du i databasen indsætter data ved hver upload, kan du lave et id-felt som 'auto-increment'. Det felt vil så være unikt for hver upload :)
jeg bruger denne $newName = md5(time().$brugernavn); da det kodet sådan at det først indsættes i databsen efter billedet er uploadet. Den løsning nielle kom med kan jeg også sagtens se ville fungere efter hans forklaring. tak for hjælpen og smid et svar olebole så får du point
Men, md5() algoritmen er jo sådan set ikke beregnet til at give et unikt resultat. Faktisk er det netop en af hovedegenskaberne ved den at man ikke kan "dekryptere" resultetet for at få inputtet tilbage. Heller ikke igennem bruteforce.
nielle >> den første betragtning er jeg helt enig i - men den hænger for mig at se ikke sammen med den anden :)
Nej, den er ikke unik, men det er trods alt voldsomt usandsynligt at ramme to ens. Graden af 'uniqueness' kommer anpå, hvad det skal bruges til, men er det meget vigtigt, bør man indsætte i DB og bruge id'et derfra.
Man kan jo forøvrigt altid indsætte tomme felter i DB'en samtidig med upload - og bruge id'et til fil-navnet - for på et senere tidspunkt at opdatere rækken i DB'en med dette id.
nielle >> Lad os begge lægge et svar og dele 'rovet' ;o)
olebole> Jeg kan desværre ikke rigtigt finde et modargument ;^)
Jeg lægger et svar, men som altid er det jo spørgerne som 100 % bestemmer, hvordan der skal fordeles. Hvis michaeltryl vælger at bruge din løsning er det vel egentlig fair nok at det er dig som får points. :^)
nielle >> nuvel, men hvis vedkommende svarer på den anden side finder, at den anden løsning er ligeså god - eller måske endda bedre - plejer en henstilling om pointdeling heldigvis at blive fulgt. Hellere pragmatik, end stringent 'hvad blev brugt?' ;o)
a1 >> Til det formål, spørgeren skal bruge løsningen, er begge de løsninger nielle og jeg har foreslået 'mere unikke' end de UUID-løsninger, du linker til.
nielle's DB-løsning er garanteret unik, sålænge billederne bruges indenfor ét og samme DB-miljø.
md5(microtime().$_FILES["tmp-name"]) er ikke garanteret unik, men dog bedre end UUID-løsningerne.
1) microtime returnerer ganske tid målt i mikrosekunder, men det er ikke det samme som at der er en mikrosekund præcision - en simpel test på min windows box viser at den springer i intervaller af 100 d.v.s. at præcisionen ikke er 1/1000000 sekund men kun 1/10000 sekunder
2) Brug af MD5 bidrager ikke med noget til problem løsning. Enhver funktion der konverterer input til et valid fil navn vil være lige så godt.
3) Brug af time alene ville være helt håbløst. Selv brug af microtime alene ville være helt håbløst. Og argumentet med at det tager mere end 1/10000 sekund at processe en fil holder ikke vand. Scheduleren kan sagtens vælge at køre lige netop den kode for to requests i parallel. Hvis det er en multi-CPU eller multi-core system, så kan den faktisk udføre to requests helt parallelt. Og det må man antage at de fleste servere er idag.
4) Det der redder situationen er filnavnet. Sandsynligheden for at to vil uploade et billede med samme navn indenfor samme 1/X sekund er næppe stor.
5) Algoritmen behøber iøvrigt ikke være unik ! Hvis den koder der skriver fejl giver fejl hvis filen eksisterer, så er det ikke noget problem med en enkelt duplikat i ny og næ - der er vare kode som genererer et nyt navn og prøver igen.
6) Hvis man absolut vil have et unikt id, så kan man bruge en hjælpe tabel med et autoincrement felt og bare bruge den værdi til filnavn.
7) Hvis performance er vigtig, så findes der en forbedring af den løsning der er kendt som Scott Amblers High-Low Approach (kan findes via Google).
Synes godt om
Ny brugerNybegynder
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.