Jaka jest najlepsza praktyka nazewnictwa przesyłanych obrazów?

15

Załóżmy, że mam formularz w mojej aplikacji internetowej, w którym użytkownicy mogą przesyłać zdjęcie profilowe.

Mam kilka wymagań dotyczących rozmiaru pliku, wymiarów itp., Ale kiedy użytkownik przesyła obraz, jak mam je nazwać w moim systemie? Przypuszczam, że musiałby być spójny, a także wyjątkowy.

Może GUID?

a5c627bedc3c44b7ae7c06a44fb3fcf8.jpg

Znacznik czasu?

129899740140465735.jpg

Hash? Np .: md5

b1a9acaf295cf14ffbc5b6538294562c.jpg

Czy istnieje standardowy lub zalecany sposób to zrobić?

Rowan Freeman
źródło
7
Jeśli Twoim celem jest przechowywanie tylko jednego zdjęcia profilowego na użytkownika, niektórzy powiedzieliby, że oczywistym wyborem będzie nazwa pliku tak samo, jak identyfikator użytkownika.
Alan Barber
znacznik czasu nie jest dobrym pomysłem, ponieważ funkcja DateTime.Now jest odświeżana tylko co 15 ms. Istnieje duża szansa na kolizję, na przykład podczas
ładunków masowych

Odpowiedzi:

27

Powinieneś spróbować osiągnąć dwa cele: wyjątkowość i użyteczność.

Korzystanie z GUID gwarantuje unikalność, ale pewnego dnia pliki mogą zostać odłączone od ich oryginalnego źródła, a wtedy będziesz mieć kłopoty.

Moim typowym rozwiązaniem jest osadzenie kluczowych informacji w nazwie pliku, takich jak identyfikator użytkownika (jeśli należy do użytkownika) lub data i godzina przesłania (jeśli jest to znaczące) lub nazwa pliku użyta podczas przesyłania.

Może to naprawdę uratować Twoją skórę pewnego dnia, gdy informacje osadzone w nazwie pliku pozwalają na przykład odzyskać dane po błędzie lub przypadkowym usunięciu zapisów. Jeśli wszystko, co masz, to GUID i stracisz katalog, będziesz miał cholerną robotę, która to wyczyści.

Na przykład, jeśli plik „My Holiday: Florida 23.jpg” zostanie przesłany przez userID 98765, w dniu 2013/04/04 o 12:51:23 nazwałbym go mniej więcej tak, dodając losowy ciąg ad8a7dsf9:

20130404125123-ad8a7dsf9-98765-my-holiday-florida-23.jpg

  • Unikalność zapewnia data i godzina oraz losowy ciąg znaków (pod warunkiem, że jest on właściwie losowy z / dev / urandom lub CryptGenRandom.
  • Jeśli plik zostanie kiedykolwiek odłączony, możesz zidentyfikować użytkownika, datę i godzinę oraz tytuł.
  • Wszystko jest składane na małe litery, a wszystko, co nie jest alfanumeryczne, jest usuwane i zastępowane myślnikami, co ułatwia obsługę nazwy pliku za pomocą prostych narzędzi (np. Brak spacji, które mogą mylić źle napisane skrypty, żadnych dwukropków lub innych znaków, które są zabronione w niektórych systemach plików , i tak dalej).
Ben
źródło
7
Ze względu na porządek polecam utworzenie osobnych katalogów dla ID użytkownika, aby po usunięciu użytkownika nie trzeba było szukać wszystkich jego zdjęć. - tak98765/20130404125123-ad8a7dsf9-my-holiday-florida-23.jpg
Shadur
1
Teoretycznie wyjątkowość nie jest zapewniona przez losowy ciąg.
Kolyunya
4
@Kolyuny, to prawda, w tym sensie, że gwarantowana globalna wyjątkowość nie jest właściwością, którą nawet GUID mają w prawdziwym życiu (nawet przewodniki v1 są usuwane z powodu wydania duplikatów adresów MAC). Wszystko, co możesz uzyskać, to statystyczne prawdopodobieństwo wyjątkowości. Ale możesz zapewnić unikalność, sprawdzając, czy plik już istnieje (używając atomowo za CreateFilepomocą CREATE_NEW) i używając innej losowości, jeśli tak jest.
Ben
„Wszystko jest składane na małe litery, a wszystko, co nie jest alfanumeryczne, jest usuwane i zastępowane myślnikami”. Chciałbym zachować mieszaną
wielkość
4

Nie chcesz stresować aplikacji (takich jak Explorer) i powodować zawieszanie się podczas otwierania katalogu. Chociaż jest mało prawdopodobne, że będziesz obciążać rzeczywisty system plików, musisz wziąć to pod uwagę, jeśli zamierzasz przechowywać tysiące plików.

Jeśli spodziewasz się przechowywać tysiące plików, proponuję podzielić na foldery. Na przykład upload\silo001, upload\silo002itd Można też zrównoważyć swoje pliki lub poczekać aż folder uderza pewną liczbę plików, a następnie utworzyć inny.

Jeśli chodzi o nazewnictwo, zawsze nazywam plik identyfikatorem GUID, ponieważ jest on unikalny na całym świecie. Ściągam rozszerzenie z przesyłania i ustawiam rozszerzenie pliku, aby pasowało, ale rzeczywista nazwa jest ustawiona z nowego Guida.

Jeśli robisz to w połączeniu z RDBMS i mają kilka kategorii, czyli produkty, kategorie itp można mieć upload\products, upload\categoriesi tak dalej, i można użyć identyfikatora wiersza jako nazwy pliku.

Jeśli chodzi o najlepsze praktyki, ja również szukałem w przeszłości i niczego nie znalazłem. Wymyśliłem powyższe podczas dyskusji z niektórymi z moich programistów.

Sam
źródło
2

W jednym z rozwiązań, nad którymi pracowałem lata temu, zrobiliśmy to: podfoldery dla części identyfikatora użytkownika, więc jeśli identyfikator użytkownika to 232950192

mielibyśmy podfoldery images / 23/29/50/192/232950192

w ostatnim folderze znajdują się foldery na albuns i imgs profilowe itp

Ale zapisujemy również wszystko w bazie danych i przechowujemy w systemie plików, aby uzyskać szybki dostęp do serwera WWW (który również ma buforowanie)

W każdym razie ostateczny obraz miałby oryginalną nazwę. Nie musieliśmy przechowywać wersji. Ale dla tego, co może przechowywać więcej podfolderów pod końcowymi nazwami albumów lub w bazie danych o identyfikatorze wersji. trzeba to przemyśleć, ponieważ przejście na produkcję byłoby trudne do zmiany bez czasochłonnych i podatnych na błędy poprawek w obecnej strukturze

Bardzo łatwo jest utworzyć podfolder w Javie i utworzyć w nim plik:

    File folder = new File(pathwithslashes);// like "images/23/29/50/192/232950192"
    folder.mkdirs();
    File imgFile = new File(folder, name);
    //Now get output stream etc

Aby uzyskać znacznik daty w podfolderach: SimpleDateFormat sdf = new SimpleDateFormat ("/ rrrr / MM / dd /"); pathwithslashes = pathwithslashes + sdf.format (now); // teraz jest util.Date Folder plików = nowy plik (pathwithslashes);

Dot net /programming/5482230/c-sharp-equivalent-of-javas-mkdirs

tgkprog
źródło
+1 za sugerowanie zagnieżdżonych katalogów. Myślę, że należy to wziąć pod uwagę, ponieważ różne systemy plików mogą napotykać problemy z wydajnością, gdy foldery zawierają „zbyt wiele” plików: stackoverflow.com/questions/197162/… , support.microsoft.com/kb/130694/en-us itp.
deizel,
1
tak, w innym systemie zawiesił się jeden z serwerów internetowych, gdy próbowaliśmy uruchomić rmdir na katalogu, który miał ponad 400 000 plików. mieliśmy więcej takich folderów. więc użyłem niestandardowego programu o nazwie dir / p, aby pobrać kilka plików na raz. zajęło kilka godzin, ale nie było przestojów :)
tgkprog
1

Polecam użyć tylko md5 lub czegokolwiek równoważnego koncepcyjnie. Zmieniając nazwy plików poprzez trawienie ich zawartości, nie tylko nadajesz wyjątkowość (zawsze przechowuj obrazy w pamięci podręcznej tak długo, jak to możliwe, a dzięki zmianie nazwy opartej na zawartości, cóż, w przypadku odpowiedniego, możesz buforować obrazy praktycznie na zawsze).

Również nie jest to wielka sprawa, ale nie jest to czysto hipotetyczny przypadek, gdy różni użytkownicy przesyłają dokładnie ten sam obraz. Zaraz po wyjęciu z pudełka będziesz mieć małą optymalizację przechowywania danych.

Jeśli chodzi o cokolwiek innego zaproponowanego: jak dla mnie, jestem silnym przeciwnikiem utrzymywania wszelkiego rodzaju informacji pomocniczych w nazwie pliku. Kiedy byłem znacznie młodszy (i trochę szczuplejszy), byłem programistą Perla i miałem wątpliwy zwyczaj przechowywania w nazwie pliku tyle informacji pomocniczych, na ile pozwalał mi na to zdrowy rozsądek, ponieważ cechy wzoru łańcucha Perla są niesamowite. Doszedłem do wniosku, że mówiąc o programowaniu stron internetowych, zawsze lepiej jest przechowywać dane powiązane z plikiem osobno od nazwy pliku.

Należy pamiętać, że w dzisiejszych czasach, gdy dominują interfejsy mobilne, rzeczywista nazwa pliku jest mniej ważna niż 5, 10 lat temu. Ale nawet jeśli będzie to miało kluczowe znaczenie w kontekście Twojej aplikacji, zawsze możesz zaangażować się w oldschoolową magię, włączając Content-Disposition: attachment; filename="pretty_file_name.jpg"nagłówek HTTP, tworząc dowolną odpowiednią nazwę pliku. Ponadto nowoczesne przeglądarki torują drogę do nowego atrybutu HTML5, pobierania . Nie wierzę, że widzenie nazwy obrazu „czytelnego dla człowieka” jest rzeczą, o której powinieneś pomyśleć w większości przypadków.

UPD: Można dokonać modyfikacji, aby nie mieć zbyt wielu plików w jednym katalogu - po prostu weź pierwsze 3 litery i utwórz katalog.

shabunc
źródło
1
czy md5 jest naprawdę wyjątkowy?
I.devries
@ I.devries, nie jestem specjalistą, ale o ile wiem, wystarczy do tego celu. Zwłaszcza jeśli dodatkowo sprawdzisz rozmiar pliku, ponieważ dobry algorytm haszujący faktycznie przyznaje, że jednostki o tym samym rozmiarze prawdopodobnie nie będą miały kolizji - stackoverflow.com/questions/2442632/…
shabunc
-1

Szanse na zderzenie z czymś takim jak sha4 są nieskończenie małe. Jeśli połączysz skrót z identyfikatorem użytkownika lub nawet prostą datą, tym bardziej.

Evan Zamir
źródło