Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]wczytywanie zdjec - katalogi
Forum PHP.pl > Forum > Przedszkole
endorfina_
Witajcie!
Posiadam skrypt uploadu zdjec.
Wyglada to tak, ze gdy user wgrywa zdjecie - to po stronie serwera tworzy sie orginalne zdjecie + zdjecie resize male + zdjecie resize srednie.
Wszystko pieknie hula tak jak powinno. Jednak natrafilem kiedys na kilka artykulow dot. tego ze jesli w jednym katalogu bedzie 2000zdjec to wczytywanie zdjec z tego katalogu bedzie bardzo nie optymalne - czy to prawda ?

pytanie nr 2
Myslalem nad rozwiazaniem takim ze gdy user wgrywa jakies zdjecie to utworzy sie nowy folder o nazwie dzisiejszej daty i w tym folderze bedzie kilkanascie zdjec uzytkownikow ktorzy tego samego dnia cos wgrali, jest to jakies rozwiazanie, ale przybedzie ilosc folderow....

Moze ktos obyty z tematem wydajnosci mi doradzic jaki schemat wgrywania zastosowac? zaraz ide do roboty, pozniej podejze jak to portale spolecznosciowe rozwiazaly, ale bylbym wdzieczny za jakies rady techniczne w tym temacie.

Dziekuje, pozdrawiam.
uupah5
Cytat(endorfina_ @ 26.03.2012, 11:37:58 ) *
jesli w jednym katalogu bedzie 2000zdjec to wczytywanie zdjec z tego katalogu bedzie bardzo nie optymalne - czy to prawda ?

prawda.
szkic jednego z możliwych rozwiązań: zdjęcie jakis_pikczer.jpg zachowujesz w katalogu:
j/a/k/i/jakis_pikczer.jpg
czyli ogólnie $picture_name -> $picture_name[0]/$picture_name[1]/$picture_name[2]/$picture_name[3]/$picture_name
ilość zagłębień ustalasz szacując całkowitą ilość zdjęć
Gość
Wybacz, ale kompletnie nie rozumiem Twojego posta. A co maja zaglebienia do optymalnosci? na moja logike wieksza ilosc folderow bedzie tez obciazeniem dla dysku. Nie lepiej zrobic to tak?:
- MaleZdjecie.jpg
upload to->/zdjecia/male/folder[name:dzisiejsza data]
- DuzeZdjecie.jpg
upload to->/zdjecia/duze/folder[name:dzisiejsza data]
Sephirus
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:

  1.  
  2. $numer_katalogu = floor($id_zdjecia/1000); // daje nam 3 (i tak powinno być)
  3.  


i wystarczy teraz utworzyć taki folderek jak go nie ma i wrzucać pliki. jest to dość przejrzysty i sprawdzony sposób wink.gif

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 wink.gif a użytkownicy będą mogli zapisać obrazek pod jego oryginalną nazwą (oczywiście musiałbyś ją zapisywać w bazie).
Gość
@Sephirus,
Tak, przechowuje sciezke do zdjecia.

BTW. kod reCAPTCHA z google tu u was jest NIE DO ODCZYTANIA!
Gość
@Sephirus,
Dziękuje Ci bardzo smile.gif
Wygląda to fajnie, ale trzeba chwile pomyslec aby to ogarnąć.
Tez myslalem aby wczytywac w locie po IDku usera.
Obaczje Twoj sposob za kilka dni gdy wroce z roboty (ble!)

@nospor
Przyznaj mu pkt pomogl, bo ja nie mam mozliwosci - z gory dzieki.
Sephirus
Ja się nie produkuje dla "punktów" haha.gif

Akurat takie coś kiedyś robiłem i ostatecznie stanęło na takiej właśnie realizacji - działało szybciutko i sprawnie bez myślenia i kombinowania nad powtarzającymi się nazwami plików itd wink.gif (poza tym do takiego systemu dość łatwo można dorobić uprawnienia do zdjęć itd...)

Ma to jednak jeden minus - zmiana liczby trzymanych plików na katalog jest uciążliwa - trzeba wówczas napisać dość prosty w sumie skrypt który poprzenosi odpowiednio pliki pomiędzy katalogami smile.gif
uupah5
Cytat(Gość)
Wybacz, ale kompletnie nie rozumiem Twojego posta. A co maja zaglebienia do optymalnosci?

zamiast np 10000 zdjęć w jednym folderze masz 100 podfolderów po 100 zdjęć
Cytat(Gość)
na moja logike wieksza ilosc folderow bedzie tez obciazeniem dla dysku.

nie specjalnie, ich ilosc bedzie mniejsza niz plikow.
za to b. duza ilosc plikow w folderze ma wplyw
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.