Avatar billede michaeltryl Seniormester
15. oktober 2007 - 18:55 Der 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
Avatar billede a1a1 Novice
15. oktober 2007 - 19:00 #1
er der ikke noget der hedder uniqueidentifiers (guid) i php? de er "altid" unike...
Avatar billede olebole Juniormester
15. oktober 2007 - 19:03 #2
<ole>

$newName = md5(time().$oldFileName);

/mvh
</bole>
Avatar billede nielle Nybegynder
15. oktober 2007 - 19:03 #3
Registrere du ikke de uploadede billeder i en tabel i din database? Så har du et unikt id der.
Avatar billede michaeltryl Seniormester
15. oktober 2007 - 19:09 #4
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.
Avatar billede nielle Nybegynder
15. oktober 2007 - 19:12 #5
Da billederne aldrig bliver tilføjet til databasen på akkurat samme tid vil det id de får i tabellen ikke være ens - det skal databasen nok sørge for.

Så omdøb den oploadede fil ved at smide id'et på navnet et eller andet passende sted i billednavnet og så burde du være sikret.
Avatar billede olebole Juniormester
15. oktober 2007 - 19:13 #6
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"]  :)
Avatar billede olebole Juniormester
15. oktober 2007 - 19:18 #7
Hvis du kører PHP5 kan du i øvrigt bruge microtime(true) i stedet for time() ... i PHP4 er det lidt mere omstændigt:
    http://dk2.php.net/manual/en/function.microtime.php

- så skal de to billeder uploades indenfor samme mikrosekund, for at få samme stamp  :)
Avatar billede olebole Juniormester
15. oktober 2007 - 19:23 #8
- 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  :)
Avatar billede michaeltryl Seniormester
15. oktober 2007 - 19:30 #9
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
Avatar billede nielle Nybegynder
15. oktober 2007 - 19:35 #10
Helt i orden.

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.
Avatar billede olebole Juniormester
15. oktober 2007 - 21:27 #11
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)
Avatar billede nielle Nybegynder
15. oktober 2007 - 22:07 #12
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. :^)
Avatar billede michaeltryl Seniormester
15. oktober 2007 - 22:45 #13
i får begge point og tak for hjælpen
Avatar billede olebole Juniormester
15. oktober 2007 - 22:54 #14
Selvtak og tak for 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)
Avatar billede nielle Nybegynder
15. oktober 2007 - 23:01 #15
Tak for point :^)
Avatar billede michaeltryl Seniormester
15. oktober 2007 - 23:04 #16
jeg brugte
$newName = md5(time().$brugernavn);
og indsatte filtypen herefter
Avatar billede a1a1 Novice
15. oktober 2007 - 23:34 #17
hmmmm.... man har åbenbart ikke guid's i php....( (your loss)
meeeen..
http://www.soulhuntre.com/items/date/2004/10/29/uuid-guid-in-native-php/
Avatar billede a1a1 Novice
15. oktober 2007 - 23:35 #18
Avatar billede olebole Juniormester
16. oktober 2007 - 03:30 #19
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.
Avatar billede arne_v Ekspert
16. oktober 2007 - 05:10 #20
Nogle betragtninger:

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).
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