2012-01-25 6 views
9

Moje pytanie nie dotyczy przechowywania obrazów na dysku lub w DB.Jaka jest najlepsza praktyka, jeśli chodzi o przechowywanie zdjęć do galerii?

  • Obrazy będą zapisywane na dysku
  • ścieżka obrazu i inne dane obraz zostanie zapisany w bazie danych.
  • obrazy będą miały niepowtarzalną nazwę pliku
  • Obrazy będą zapisywane w 3 rozmiarach
  • W czasie może być wiele obrazów wykorzystywane przez wielu użytkowników

moje pytania są następujące:
- Gdyby obrazy być przechowywane w jednym folderze lub wielu folderach?
- Czy można używać md5 do tworzenia unikalnych identyfikatorów? Na przykład. md5 (id + filename + random_num)
- Czy obrazy powinny być przechowywane w pamięci podręcznej na serwerze lub w przeglądarce/komputerze klienta?

Coś jeszcze powinienem wymyślić?

Rozwiązaniem jest użycie php, apache i mysql. Używamy funkcji Uploadify do przesyłania zdjęć.

Niektóre kod używam dzisiaj

/** 
    * Calculate dir tree for object 
    * Folders starts from 00 to FF (HEX) and can have just as 
    * many subfolders (I think :) 
    * @param $id - User ID 
    * @param $type - Image category 
    * @return string 
    */ 
    function calculateDirTree($id, $type) 
    { 
     $hashUserID = substr(hash('md5', $id), -4); 
     $parentFolder = substr($hashUserID,0,2); 
     $subfolder = substr($hashUserID,2);  
     $basePath  = $type."/".$parentFolder.'/'.$subfolder.'/'; 

     return $basePath; 
    } 
+0

Ile zdjęć masz według Ciebie? Setki ? Tysiące? Setki tysięcy ? –

+0

Przez następne kilka lat oceniam około 100 tys. - 200 tys. Obrazów. – Steven

+0

Użyjesz tej samej nazwy pliku, co użytkownik przesłał, a jeśli przechowujesz w tym samym folderze, może być szansa, że ​​zastąpisz obraz, jeśli ma on taką samą nazwę pliku jak poprzednio przesłany obraz. –

Odpowiedz

3

Czy obrazy powinny być przechowywane w jednym folderze lub w wielu folderach?

Mówisz o "100k - 200k obrazów", więc wiele folderów jest koniecznością. Spróbuj mieć max. ~ 1000 zdjęć w folderze.

Czy można używać md5 do tworzenia unikalnych identyfikatorów? Na przykład. md5 (id + filename + losowy_num)

Tak, możesz to zrobić. Pozwoli to uniknąć problemów z długimi nazwami plików.

Czy obrazy należy przechowywać w pamięci podręcznej na serwerze lub w przeglądarce/komputerze klienta?

Powinny być buforowane po stronie klienta. Problem z tylu obrazami polega na tym, że generuje duży ruch. Buforowanie na kliencie pomaga zredukować to.

0

chodzi o buforowanie, byłoby najlepiej, aby buforować je na obu końcach, w ten sposób nowe obrazy są pobierane szybko, a użytkownicy odwiedzający istniejących obrazów mieć to w pamięci podręcznej.

Nie znam żadnych ograniczeń systemu plików dotyczących przechowywania ich w jednym lub wielu folderach.

0

Myślę, że używanie wielu folderów lub tego samego folderu zależy od Twojej aplikacji internetowej. Na przykład, jeśli istnieje wiele profili z każdym profilem zawierającym wiele obrazów, można użyć wielu folderów z nazwami folderów jako nazwami profili.

Moja ostatnia rada jest jeśli masz mnóstwo zdjęć sha256 algorytm szyfrujący jest lepsze dla zapobiegania kolizji

3

zależności od liczby obrazów, które chcesz obsługiwać, chciałbym zdecydowanie wskazują użyciu kilku folderów. Najprostszym sposobem powinno być użycie pierwszej litery nazwy pliku, aby utworzyć strukturę folderów. Myślę, że liczby te są mniej więcej tak:

less than 1000 images --> one folder 
less than 20000 images --> one level of folders (a, b, c, ...) 
more     --> several levels (a containing aa, ab, b containing ba, bb, ...) 

YMMV

+0

Dodałem strukturę plików, której użyłem w moim teście. Zastanawiam się, czy powinienem się tego trzymać. – Steven

0

zdecydowanie przejść dla systemu plików: to bardziej wydajnych i lepiej pasuje do przechowywania plików (to co jest dla). Sql może zwolnić podczas zapisywania/pobierania dużych obrazów. Możesz utworzyć folder dla każdego użytkownika (używając ID jako nazwy folderu), a kiedy obraz zostanie zapisany w systemie plików, możesz zapisać referencję na tabeli UserImages (zapisując nazwę pliku na bazie użytkownika na sql). Możesz upewnić się, że każdy obraz ma unikalną nazwę pliku, zmieniając jego nazwę podczas zapisywania, możesz użyć kombinacji oryginalnej nazwy pliku z faktyczną datą czasu (bez potrzeby używania MD5). Również obrazy powinny być zawsze buforowane, aby zapisać pasmo użytkownika i klientów.

+0

Jeśli czytasz moje pytanie, nie pytam, czy dysk lub DB jest najlepszy. Poza tym właśnie opisałeś (w większej ilości słów) moje pytanie powyżej. – Steven

+0

Witam Steven, jeśli ponownie przeczytasz moją odpowiedź, próbowałem odpowiedzieć na twoje pytania, jeśli nie jest to jasne: 1) Tak, powinieneś podzielić zdjęcia na wiele folderów (najlepiej jeden folder na użytkownika). 2) Nie, nie potrzebujesz md5 dla nazwy pliku, po prostu użyj DateTime przesłanego pliku. 3) Tak, powinieneś buforować obrazy, jeśli ten sam obraz na serwerze nie ulegnie zmianie (np. Obraz jest przycięty i zachowuje tę samą nazwę pliku). Jeśli to nie jest to, czego szukasz, przeformułuj swoje pytanie. –