Co to jest sposób na zapisywanie obrazów w Ruby on Rails?

9

Rozwijam się na iOS i przełączam się z backendu PHP na Ruby on Rails. Format wymiany to JSON .

Szybkie wyszukiwanie w Google hasła „zapisz obrazy w Railsach” daje prawie każdy wynik mówiący o zapisywaniu danych obrazu jako obiektów blob w bazie danych. Mogę się mylić, ale mam wrażenie, że zapisywanie danych obrazu w bazie danych to ogromna strata czasu i miejsca (w przeciwieństwie do zapisywania linku do lokalizacji pliku („/img/subcat/4656.png”) .

W PHP standardem jest odbieranie danych, generowanie nazwy pliku, zapisywanie tego pliku na dysku i aktualizowanie bazy danych o położenie obrazu na dysku. Czy to samo dotyczy Ruby on Rails, czy jest jakaś wbudowana funkcja obrazu ActiveRecord, o której nie wiem?

użytkownik
źródło
1
Natknąłem się na PaperClip , który wydaje się być bardzo blisko tego, czego chcę. Wciąż doceniłbym porady doświadczonych ludzi z Rails, jak radzić sobie z serwowaniem i odbieraniem tysięcy zdjęć z optymalną prędkością.
użytkownik
1
Wiesz, że obraz zajmie tyle samo miejsca na db lub na dysku, prawda? Z wrażenia, powiedziałbym, że Rails przechowuje dane w bazie danych, ponieważ nie opiera się na apache tak bardzo jak PHP do obsługi buforowania. To może być całkowicie błędne.
Florian Margaine,
2
Tak, nie sądzę, że dane obrazu zostaną zmanipulowane przez miejsce przechowywania. Szyny mogą być inne, ale niektórzy zaufani członkowie SO wydają się skłaniać ku ścieżkom plików w bazie danych. Ponadto uważam, że powszechnie wiadomo, że trudno jest skalować bazy danych, więc przechowywanie ton danych obrazów w bazie danych z pewnością nie ułatwi tego.
użytkownik

Odpowiedzi:

4

W przeszłości korzystałem z PaperClip z Amazon S3 i CloudFront CDN, aby przyspieszyć dostawę. PaperClip bardzo dobrze obsługuje pamięć S3 po wyjęciu z pudełka: zapoznaj się z dokumentacją opcji konfiguracji pamięci S3 .

  1. Skonfiguruj dystrybucję CloudFront, aby przekazywać żądania obrazów do segmentu S3 i inne żądania dotyczące zasobów statycznych do aplikacji Ruby on Rails (możesz również przesłać je do S3, ale to nie wchodzi w zakres tego pytania).
  2. CNAME domenę, którą kontrolujesz (np. Asset.example.com), aby wskazać dystrybucję CloudFront.
  3. W konfiguracji PaperClip ustaw s3_host_alias: assets.example.com. Spowoduje to, że wygenerowane adresy URL do zapisanych zasobów obrazu będą korzystać z hosta dystrybucji CloudFront.
  4. W konfiguracji Ruby on Rails możesz to zrobić config.action_controller.asset_host = http://assets.example.com. Adresy URL zasobów Ruby on Rails będą wówczas wykorzystywać również dystrybucję CloudFront do buforowania / szybszego dostarczania.

To dość szkicowe, ale mam nadzieję, że skieruje cię w stronę przydatnych zasobów. Oczywiście to tylko jedno rozwiązanie, ale to zadziałało dla mnie w sytuacji, gdy miałem do czynienia z setkami tysięcy załączników graficznych w bazie danych.

(Jako możliwy zaawansowany krok, który może nie być konieczny lub przydatny w twoim przypadku, możesz również skonfigurować wiele CNAME dla swojej dystrybucji CloudFront, takich jak assets0.example.comi assets1.example.com. Zarówno spinacz do papieru, jak s3_host_aliasi action_controller.asset_hostnastępnie możesz pobrać lambdas, które pozwolą ci deterministycznie (na podstawie zasób) generuje adresy URL, które używają różnych hostów, dla lepszej równoległości, jeśli pobierasz ich kilka na tej samej stronie, ponieważ przeglądarki ograniczą maksymalną liczbę jednoczesnych połączeń z tym samym hostem).

Gregates
źródło
3

Próbowałem kilku klejnotów, ale teraz używam FineUploader razem z PaperClip

FineUploader obsługuje dla Ciebie wiele GUI, na przykład postęp przesyłania, przeciąganie i upuszczanie oraz przesyłanie wielu plików i tak dalej. Korzystam z PaperClip, ponieważ chcę przechowywać obrazy na moich serwerach zamiast na S3.

Zwykle szukamy stabilnego, konfigurowalnego rozwiązania, zamiast odtwarzać rzeczy od zera. Za pomocą PaperClip przechowuję obrazy, a za pomocą StateMachine dokonuję konwersji obrazów i umieszczam je w kategorii na podstawie nazwy pliku. Miałem to samo pytanie, co ty, i to było moje najlepsze działające rozwiązanie, dlatego dzielę się tym.

JeroenKnoops
źródło
2
Jest to tylko zalecenie dla zewnętrznego pakietu do wykonania pracy; OP pytało o to, co zwykle robią Ruby on Rails, aby przechowywać obrazy, a nie o rekomendacje. Chociaż może to być przykład tego, jak robi to jeden pakiet, to tak naprawdę nie odpowiada na pytanie.
Martijn Pieters
Prawdziwe. Zwykle szukamy stabilnego, konfigurowalnego rozwiązania, zamiast odtwarzać rzeczy od zera. Za pomocą PaperClip przechowuję obrazy, a za pomocą StateMachine dokonuję konwersji obrazów i umieszczam je w kategorii na podstawie nazwy pliku. Miałem to samo pytanie, co OP, i to było moje najlepsze działające rozwiązanie, dlatego dzielę się nim.
JeroenKnoops