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ć?
asp.net-mvc
file-handling
naming-standards
Rowan Freeman
źródło
źródło
Odpowiedzi:
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
źródło
98765/20130404125123-ad8a7dsf9-my-holiday-florida-23.jpg
CreateFile
pomocąCREATE_NEW
) i używając innej losowości, jeśli tak jest.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\silo002
itd 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\categories
i 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.
źródło
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:
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
źródło
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.
źródło
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.
źródło