kategorie

Ostatnia aktualizacja 08 maja 2018 r

Rails 5.2 wprowadził Active Storage jako sposób zarządzania dołączaniem i zapisywaniem plików do modeli Active Record. W tym przewodniku dowiesz się, jak korzystać z aktywnego miejsca na Heroku.

efemeryczny Dysk

Heroku ma „efemeryczny” dysk twardy, co oznacza, że możesz zapisywać pliki na dysku, ale pliki te nie będą się utrzymywać po ponownym uruchomieniu aplikacji. Domyślnie Active Storage używa opcji :local storage, która używa lokalnego systemu plików do przechowywania przesłanych plików. Podczas gdy przesyłanie plików, które są przechowywane z opcją :local, wydaje się działać na początku, załączniki będą wykazywać pozornie dziwne zachowanie i ostatecznie znikną. Pliki znikną po wdrożeniu aplikacji lub po jej automatycznym ponownym uruchomieniu (raz na 24 godziny). Jeśli aplikacja ma wiele hamowni, nie wszystkie pliki będą obecne na każdej hamowni. Oznacza to, że hamownia, która obsługuje żądanie internetowe, może być inna niż hamownia, która zawiera określony przesłany plik. Na przykład, jeśli masz dwie dyny i przesyłasz plik, będzie on obecny tylko na jednej dynie. Po odświeżeniu strony internetowej będzie 50% szansa, że żądanie sieciowe zostanie przekierowane do hamowni z plikiem, a 50% szansa, że zostanie uszkodzone. Ponadto pliki przechowywane na dysku nie będą widoczne z jednorazowych Dynów, takich jak instancja heroku run bash lub zadanie schedulera, ponieważ polecenia te używają nowych Dynów.

zamiast przechowywać przesłane pliki na dysk, najlepszą praktyką jest wykorzystanie usługi przechowywania plików w chmurze, takiej jak Amazon S3.

aby użyć innego zaplecza pamięci masowej, musisz zmodyfikować plik config/storage.yml. Jeśli używasz dodatku bucketeer do zarządzania S3 dla Ciebie, możesz dodać go do swojego config/storage.yml:

amazon: service: S3 access_key_id: <%= ENV %> secret_access_key: <%= ENV %> region: <%= ENV %> bucket: <%= ENV %>

gdy to zrobisz, musisz poinformować swoją aplikację, aby używała tego zaplecza pamięci masowej w produkcji. W config/environments/production.rb upewnij się, że ustawiłeś aktywną usługę przechowywania na amazon:

 config.active_storage.service = :amazon

na koniec musisz również dołączyć klejnot AWS. Dodaj to do swojego Gemfile:

gem "aws-sdk-s3", require: false

nie zapomnij uruchomić tego polecenia lokalnie:

$ bundle install

następnie prześlij swoje pliki do git, zanim spróbujesz wdrożyć je do Heroku.

podgląd załączników

jedną z funkcji zaznaczenia w Active Storage jest możliwość korzystania z „podglądów” załączników innych niż obrazy. W szczególności możesz przeglądać pliki PDF i filmy. Aby korzystać z tej funkcji, aplikacja potrzebuje dostępu do zasobów systemowych, które wiedzą, jak pracować z tymi plikami. Domyślnie Rails obsługuje pliki poppler dla podglądów PDF i ffmpeg dla podglądów wideo. Te zależności systemowe nie są domyślnie dostępne w Heroku.

jeśli chcesz mieć możliwość podglądu tych typów plików z aktywną obsługą, musisz uruchomić:

$ heroku buildpacks:add -i 1 https://github.com/heroku/heroku-buildpack-activestorage-preview

gdy to zrobisz, musisz ponownie wdrożyć, aby uzyskać pliki binarne. Możesz sprawdzić, czy zależności są zainstalowane, uruchamiając which ffmpeg w wierszu poleceń. Jeśli nie ma wyjścia, to operacja nie została wykonana poprawnie. Jeśli zobaczysz wynik, pliki binarne są gotowe do użycia:

$ heroku run bash~$ which ffmpeg/app/.heroku/activestorage-preview/usr/bin/ffmpeg

jeśli spróbujesz wyświetlić podgląd pliku PDF bez poppler, Strona się pomyli i zobaczysz to w dziennikach:

ActionView::Template::Error (ActiveStorage::UnpreviewableError)

jeśli spróbujesz wyświetlić podgląd wideo bez ffmpeg, podgląd wydaje się być uszkodzony i zobaczysz taki błąd w logach:

Errno::ENOENT (No such file or directory - ffmpeg):

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.