Jakie jest najlepsze miejsce do przechowywania przesłanych obrazów, bazy danych SQL lub systemu plików na dysku?

Piszę aplikację, która umożliwia użytkownikom przesyłanie obrazów na serwer. Spodziewam się około 20 zdjęć dziennie wszystkie jpeg i prawdopodobnie nie edytowane / zmiana rozmiaru. (Jest to kolejne pytanie, jak zmienić rozmiar obrazów po stronie serwera przed przechowywaniem. Może ktoś mógłby wrzucić do tego w komentarzu zasób. NET). Zastanawiam się teraz, jakie jest najlepsze miejsce do przechowywania przesłanych zdjęć.

  • Zapisz obrazy jako plik w systemie plików i utwórz rekord w tabeli z dokładna ścieżka do tego obrazu.

  • Można też zapisać sam obraz w tabeli za pomocą typu danych "image" lub "binary data" serwera bazy danych.

Widzę zalety i wady w obu. Lubię) , ponieważ mogę łatwo przenieść pliki i po prostu trzeba zmienić wpis tabeli. Z drugiej strony nie lubię przechowywać danych biznesowych na serwerze WWW i tak naprawdę nie chcę łączyć serwera www z żadnym innym źródłem danych, które przechowuje dane biznesowe (dla bezpieczeństwa uzasadnienie) Lubię b) ponieważ wszystkie informacje są w jednym miejscu i łatwo dostępne przez zapytanie. Z drugiej strony baza danych stanie się wkrótce bardzo duża. Outsourcing tych danych może być trudniejszy.

Author: BalusC, 2008-12-08

19 answers

Generalnie przechowuję pliki w systemie plików, ponieważ po to jest, chociaż są wyjątki. W przypadku plików system plików jest najbardziej elastycznym i wydajnym rozwiązaniem (zazwyczaj).

Istnieje kilka problemów z przechowywaniem plików w bazie danych - pliki są na ogół znacznie większe niż przeciętny wiersz - zestawy wyników zawierające wiele dużych plików zużywają dużo pamięci. Ponadto, jeśli używasz silnika pamięci, który używa table-locks do zapisu (na przykład ISAM), Twoje pliki tabela może być często blokowana w zależności od rozmiaru / szybkości przechowywanych plików.

Jeśli chodzi o bezpieczeństwo - zazwyczaj przechowuję pliki w katalogu, który znajduje się poza głównym katalogiem dokumentu (niedostępny przez żądanie http) i podaję je za pomocą skryptu, który sprawdza najpierw poprawną autoryzację.

 77
Author: Eran Galperin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 00:03:20

Jedyną korzyścią dla opcji B jest posiadanie wszystkich danych w jednym systemie, ale jest to fałszywa korzyść! Możesz twierdzić, że Twój kod jest również formą danych, a zatem również może być przechowywany w bazie danych-jak byś tego chciał?

Chyba że masz jakiś unikalny przypadek:

  • logika biznesowa należy do kodu.
  • Dane strukturyzowane należą do bazy danych (relacyjnej lub nie relacyjnej).
  • dane zbiorcze należą do magazynu (system plików lub inne).

Pliki, Kod, Dane

Nie jest konieczne używanie systemu plików do przechowywania plików. Zamiast tego możesz użyć pamięci masowej w chmurze (takiej jak Amazon S3 ) lub infrastruktury jako usługi na jej szczycie (takiej jak Uploadcare):

Https://uploadcare.com/upload-api-cloud-storage-and-cdn/

Ale przechowywanie plików w bazie danych to zły pomysł.

 33
Author: David Avsajanishvili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 21:54:00

Flickr używa systemu plików -omawiają powody tutaj

 20
Author: Martin Beckett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 00:41:45

Mieliśmy klientów nalegających na opcję B (przechowywanie baz danych) kilka razy na kilku różnych backendach, a my Zawsze ostatecznie wróciliśmy do opcji A (Przechowywanie systemów plików).

Duże Bloby, takie jak te, nie były obsługiwane wystarczająco dobrze nawet przez SQL Server 2005, który jest najnowszym, na którym go wypróbowaliśmy.

Konkretnie, widzieliśmy poważne wzdęcia i myślę, że może problemy z blokowaniem.

Jeszcze jedna uwaga: jeśli używasz pamięci masowej opartej na systemie NTFS (windows server, etc) możesz rozważyć znalezienie sposobu na umieszczenie tysięcy plików w jednym katalogu. Nie jestem pewien dlaczego, ale czasami system plików nie radzi sobie dobrze z tą sytuacją. Jeśli ktoś wie więcej na ten temat to chętnie posłucham.

Ale zawsze staram się użyć podkatalogów, aby trochę popsuć sprawy. Data utworzenia często działa dobrze dla tego:

Images/2008/12/17/.jpg

...Zapewnia to przyzwoity poziom separacji, a także pomaga nieco podczas debugowania. Explorer i Klienci FTP mogą się trochę zadławić, gdy istnieją naprawdę ogromne katalogi.

EDIT: krótka notka na 2017 rok, w nowszych wersjach SQL Server pojawiły się nowe opcje obsługi wielu Blobów, które mają uniknąć wad, o których mówiłem.

 10
Author: Brian MacKay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 13:18:57

Niedawno stworzyłem aplikację PHP / MySQL, która przechowuje pliki PDF/Word w tabeli MySQL (aż 40MB na plik).

PLUSY:

  • przesłane pliki są replikowane na serwer kopii zapasowych wraz z całą resztą, nie jest potrzebna oddzielna strategia tworzenia kopii zapasowych (spokój ducha).
  • Konfiguracja serwera www jest nieco prostsza, ponieważ nie muszę mieć folderu uploads/ i mówić wszystkim moim aplikacjom, gdzie jest.
  • mogę używać transakcji do edycji do popraw integralność danych-nie muszę się martwić o osierocone i brakujące pliki

Wady:

  • mysqldump zajmuje teraz dużo czasu, ponieważ w jednej z tabel znajduje się 500MB danych.
  • ogólnie niezbyt wydajna pamięć / procesor w porównaniu do systemu plików

Nazwałbym moją implementację sukcesem, zajmuje się ona wymaganiami tworzenia kopii zapasowych i upraszcza layout projektu. Wydajność jest dobra dla 20-30 osób, które korzystają z app.

 8
Author: too much php,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 04:29:55

Używam przesłanych zdjęć na mojej stronie i zdecydowanie powiedziałbym opcję a).

Jeszcze jedna rzecz, którą gorąco polecam, to natychmiastowa zmiana nazwy pliku z tego, co użytkownik nazwał zdjęciem, na coś bardziej zarządzalnego. Na przykład coś z datą i godziną, aby jednoznacznie zidentyfikować każde zdjęcie.

Pomaga również usunąć nazwę pliku Użytkownika z dziwnych znaków, aby uniknąć przyszłych komplikacji.

 6
Author: barfoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 02:12:25

Zdecydowanie Zmień rozmiar obrazu i sprawdź jego format, jeśli możesz. Zdarzały się przypadki, że złośliwe pliki były przesyłane i serwowane przez nieświadomych hostów - na przykład luka w zabezpieczeniach GIFAR umożliwiała ukrycie złośliwego apletu Javy w pliku GIF, który następnie mógł odczytać pliki cookie w bieżącym kontekście i wysłać je do innej witryny w celu ataku skryptów między stronami. Zmiana rozmiaru obrazów Zwykle temu zapobiega, ponieważ munges osadzony kod. / Align = "left" / poprawione przez łatki JVM, naiwne serwowanie plików binarnych bez ich szorowania otwiera Cię na całą gamę luk.

Pamiętaj, że większość skanerów antywirusowych może działać tylko przeciwko systemowi plików - jeśli przechowasz swoje pliki binarne w DB, nie będziesz w stanie uruchomić skanera na nich bardzo łatwo.

 6
Author: Tim Howland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-11 01:21:33

Wiem, że to stary post. Ale wielu odwiedzających tę stronę nie dostaje nic związanego z tym pytaniem. Zwłaszcza dla nowicjusza.

Jak przesyłać i przechowywać zdjęcia lub pliki w naszej witrynie:

Dla statycznej strony internetowej może nie ma problemu, ponieważ przechowywanie plików dla niektórych hostingu akcji nadal wystarcza. Problem pochodzi z dynamicznej strony internetowej, gdy robi się większa. Większe w bazie danych mogą być obsługiwane, ale większe w plikach takich jak obrazy staje się problemem. Istnieją dwa rodzaje zdjęcia w witrynie:

  1. Obrazy pochodzą od administratora dynamicznego bloga. Zazwyczaj obrazy te zostały zoptymalizowane przed przesłaniem.

  2. Obrazy od użytkowników w przypadku użytkowników może przesyłać obrazy takie jak avatar. Lub użytkownicy mogą tworzyć treści bloga i umieszczać obrazy z edytora tekstu. Tego rodzaju obrazy są trudne do przewidzenia wielkości. Użytkownicy mogą przesyłać duże obrazy tylko dla małych treści, zmieniając rozmiar widoku, ale nie zmieniając rozmiaru obrazu.

Ignorując pozycję NR 1 powyżej, szybkie rozwiązanie dla pozycji nr 2 może być tymczasowo rozwiązane za pomocą następujących wskazówek, jeśli nie mamy funkcjonalności optymalizatora obrazu w naszej witrynie:

  1. Nie zezwalaj użytkownikom na bezpośrednie przesyłanie z edytora tekstu poprzez przekierowanie ich do Galerii Obrazów. Na tej stronie użytkownicy muszą wcześniej przesłać plik, zanim będą mogli umieścić go w treści. Ta metoda jest wywoływana jako menedżer plików.

  2. Użyj funkcji kadrowania obrazu, aby Prześlij zdjęcia. To ograniczy Rozmiar obrazu nawet użytkownicy przesyłają bardzo duży plik. Ostateczny obraz jest wynikiem przyciętego obrazu. Rozmiar możemy zdefiniować po stronie serwera i przyjąć tylko na przykład 500Kb lub mniej.

To tylko tymczasowe. Dla ostatecznego rozwiązania pytanie powtarza się:

  • Jak poradzić sobie z przechowywaniem dużych obrazów?
  • Zmień rozmiar lub zmień rozszerzenie.
  • jak duża lub średnia strona internetowa lub e-commerce obsługuje przechowywanie plików dla ich obrazy?

Co wtedy możemy zrobić:

  1. Migracja z hostingu współdzielonego VPS. Za mało? Następnie wyższe, uaktualniając do dedykowanego.

  2. Utwórz własny serwer do przechowywania plików. Googlowanie, żeby to zrobić. To nie jest tak trudne, jak myślisz. Niektórzy ludzie robią to dla swojej strony internetowej.

  3. Prostym sposobem jest korzystanie z usługi przechowywania plików CDN.

Ok, 1 i 2 to trochę drogo. Ale nr 3 myślę, że jest najlepszy rozwiązanie.

Niektóre usługi CDN pozwalają przechowywać tyle plików internetowych, ile chcesz.

Pytanie " Jak wgrać plik do CDN z naszej strony?"

Nie martw się, po zarejestrowaniu się, zwykle za darmo, otrzymasz wskazówki, jak przesłać plik i uzyskać ich link Z / do swojej strony internetowej. Otrzymasz API i więcej. To proste.

Niektórzy dostawcy dają nam bezpłatną usługę na 14 dni z ograniczoną pamięcią masową i przepustowością. Ale to będzie w porządku na początek. Jedynym problemem jest bo "ludzie nigdy nie próbują".

Mam nadzieję, że to pomoże nowicjuszowi.

 5
Author: Sulung Nugroho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-07 17:09:51

Większość implementacji to opcja A.

W opcji B otwierasz całą dużą puszkę whoop4ss, gdy zamieniasz te bity z bazy danych na coś, co może być wyświetlane w przeglądarce... Ponadto, jeśli db jest w dół, obrazy nie są dostępne.

Myślę, że przestrzeń nie jest zbyt wielkim problemem... Dyski terabajtowe to teraz kilkaset dolców.

Wdrażamy z opcją A, ponieważ nie mamy czasu ani zasobów na wykonanie opcji B.

 3
Author: mson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 00:40:29

W celu automatycznej zmiany rozmiaru, spróbuj imagemagick... jest używany w wielu głównych systemach zarządzania treścią open source/zdjęciami... i wierzę, że istnieje kilka rozszerzeń. NET dla niego.

 3
Author: jle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 01:58:15

Istnieje rodzaj hybrydowego podejścia w SQL Server 2008 o nazwie FileStream datatype, o którym mówiono w RunAs Radio #74, który jest jakby najlepszym z obu światów. Większość ludzi nie ma otion 2008, ale jeśli tak, ta opcja wygląda całkiem fajnie

 3
Author: Charles Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-09 05:15:10

Używamy A. umieściłbym go na współdzielonym dysku (chyba, że nie planujesz uruchomić więcej niż jednego serwera).

Jeśli nadejdzie czas, kiedy to nie będzie skalowane dla ciebie, możesz zbadać mechanizmy buforowania.

 2
Author: csexton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 00:03:56

Absolutnie, pozytywnie opcja A. inni wspominali, że bazy danych generalnie nie radzą sobie dobrze z Blobami, niezależnie od tego, czy są do tego zaprojektowane, czy nie. Systemy plików, z drugiej strony, żyją dla tych rzeczy. Masz możliwość korzystania z pasków RAID, rozrzucania obrazów na wiele dysków, a nawet rozrzucania ich na różne geograficznie serwery.

Kolejną zaletą jest to, że kopie zapasowe/replikacja bazy danych byłyby potworne.

 2
Author: dj_segfault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 01:46:47

Opcja A.

Po załadowaniu obrazu możesz zweryfikować format i zmienić jego rozmiar przed zapisaniem. Istnieje wiele próbek kodu. NET do zmiany rozmiaru obrazów na http://www.codeproject.com . na przykład: http://www.codeproject.com/KB/cs/Photo_Resize.aspx

 2
Author: Leah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-09 04:40:26
 2
Author: Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:04

Cóż, mam podobny projekt, w którym użytkownicy wgrywają pliki na serwer. Z mojego punktu widzenia opcja a) jest najlepszym rozwiązaniem ze względu na większą elastyczność. To, co musisz zrobić, to przechowywać obrazy w chronionym folderze sklasyfikowanym według podkatalogów. Główny katalog musi być ustawiony przez administratora, ponieważ zawartość nie może uruchamiać skryptów (bardzo ważne) i (odczytywać, zapisywać) chroniona, ponieważ nie jest dostępna w żądaniu http.

Mam nadzieję, że to ci pomoże.

 2
Author: domoindal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-06 14:52:17

W Zasadzie to tak.

  1. przechowuj przesłany obraz w tymczasowym katalogu lub pamięci.
  2. Przetworz Ten obraz przed trwałym zapisaniem go. 2.1. Korekcje kolorów 2.2. Kompres 2.3. Tworzenie kilku kopii na podstawie wymiarów obrazu 2.4. Zmień nazwę z .xl,lg, .md,. sm itp. przyrostki
  3. spakuj wszystkie przetworzone pliki graficzne (z jednego pliku) do folderu o nazwie folderu id, który będzie przechowywany w bazie danych dla dowolnego wiersza/dokumentu wzdłuż z image file name (lub może być nazwą losową jako nazwa obrazu).
  4. Utwórz RRRR / mm / d path folder, jeśli nie istnieje. Na przykład 2016/08/21. Zapamiętaj tę ścieżkę i zapisz w bazie danych dla tego samego dokumentu i wiersza.
  5. przenieś obraz id do folderu path. (Folder Path może znajdować się w folderze/var / web-content.)
  6. spłukać bufor pamięci lub usunąć plik tymczasowy.

Gdy musisz uzyskać dostęp do dowolnego obrazu wymienionego w dokumencie, masz ścieżkę i identyfikator folder zawiera obrazy. Na przykład /var/web-content/{{path}}/{{id}}/image-file-name.sm.jpg

W ten sposób, jeśli musisz usunąć wszystkie przetworzone pliki obrazów, po prostu usuń folder i jego zawartość rekurencyjnie.

 2
Author: Uday Hiwarale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 16:17:13

Jeśli są to małe pliki, które nie będą musiały być edytowane, to opcja B nie jest zła. Wolę to niż pisanie logiki do przechowywania plików i radzenia sobie z szalonymi problemami ze strukturą katalogów. Posiadanie dużej ilości plików w jednym katalogu jest złe. emkay?

Jeśli pliki są duże lub wymagają stałej edycji, zwłaszcza z programów takich jak office, to opcja A jest najlepszym rozwiązaniem.

W większości przypadków jest to kwestia preferencji, ale jeśli wybierzesz opcję A, po prostu zrób re katalogi nie zawierają zbyt wielu plików. Jeśli wybierzesz opcję B, wtedy tabela z danymi BLOBed znajdzie się we własnej bazie danych i/lub grupie plików. Pomoże to w konserwacji, zwłaszcza kopii zapasowych / przywracania. Twoje zwykłe dane są prawdopodobnie dość małe, podczas gdy dane obrazu będą ogromne z czasem.

 1
Author: Charles Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-09 05:11:25

To zależy od twoich wymagań, szczególnie głośności, użytkowników i częstotliwości wyszukiwania. Ale w przypadku małych i średnich biur najlepszym rozwiązaniem jest użycie aplikacji takiej jak Apple Photos lub Adobe Lightroom. Specjalizują się w przechowywaniu, katalogowaniu, indeksowaniu i organizowaniu tego rodzaju zasobów. Ale dla dużych organizacji, o wysokich wymaganiach dotyczących pamięci masowej i dużej liczbie użytkowników, zaleca się utworzenie platformy zarządzania treścią z cyfrowym zarządzaniem zasobami, takiej jak Nuxeo lub Alfresco; zarówno oferuje bardzo dobre zasoby do zarządzania bardzo dużą ilością danych z uproszczonymi metodami ich pobierania. I, bardzo ważne: istnieje Darmowa (open source) opcja dla obu platform.

 1
Author: Carlos Camargo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 15:43:33