A powiedz czy przechowujesz jakieś dane o zdjęciach wgrywanych w bazie danych?
Bo jeśli zapisujesz jakieś info o tych zdjęciach do bazy to na pewno dane zdjęcie ma swoje unikalne, numeryczne ID a co za tym idzie można je wrzucać wtedy do folderów z prostym podziałem.
Proponuje trzymanie max 1000 plików w jednym folderze.
Układ folderów:
male/[numer_folderu]/[nazwa_pliku]
średnie/[numer_folderu]/[nazwa_pliku]
oryginalne/[numer_folderu]/[nazwa_pliku]
[nazwa_pliku] - nazwa pliku zapisywana wprost (trzeba uważać na powtórzenia) lub po przekształceniu - na przykład md5([ID]) lub samo ID
[numer_folderu] - tu trochę więcej:
skoro mamy trzymać 1000 obrazków na katalog to będzie to wyglądac jakoś tak:
nr katalogu | zdjęcia o numerach
0 | 0-999
1 | 1000-1999
2 | 2000-2999
3 | 3000-3999
.... | ....
I teraz mamy zdjęcie numer 3765 powiedzmy - jak określić katalog - proste:
$numer_katalogu = floor($id_zdjecia/1000
); // daje nam 3 (i tak powinno być)
i wystarczy teraz utworzyć taki folderek jak go nie ma i wrzucać pliki. jest to dość przejrzysty i sprawdzony sposób

EDIT: Acha no i oczywiście jeśli chcesz też zdjęcie wyświetlić znając jego ID stosujesz ten sam algo. (cała ścieżka wtedy nie musi być nigdzie zapisywana - możesz ją generować w locie i w zależności od rozmiaru obrazka zmieniać tylko początek "male","srednie" itd...)
Jeszcze dodatkowo dobrym pomysłem jest zapisywanie tych zdjęć jako same ich id czyli zamiast "zdjecie.jpg" dla zdjęcia o ID=123 zapisujemy "123" bez rozszerzenia itd...
Wówczas jeszcze łatwiej je znaleźć. Wystarczy wtedy dać link typu:
strona.pl/obrazki/male/0/123/zdjecie.jpg
I dać odpowiedni htaccess (mod-rewrite):
Kod
RewriteRule ^obrazki/([a-z]+)/([0-9]+)/([0-9]+)/.+$ obrazki/$1/$2/$3
I ta regułka pod tym adresem podanym wyżej załaduje tak naprawdę samo strona.pl/obrazki/male/0/123 czyli nasz plik z obrazkiem

a użytkownicy będą mogli zapisać obrazek pod jego oryginalną nazwą (oczywiście musiałbyś ją zapisywać w bazie).