Где я должен хранить загруженные пользователем файлы и изображения в Phoenix/Elixir?

Пользователи моего приложения должны иметь возможность загружать такие файлы, как изображения. Где, в какой папке следует сохранять эти файлы? Я не знаком с развертыванием приложений Elixir/Phoenix, но я не хочу включать эти файлы в выходные, упакованные файлы (файлы), которые генерируются при развертывании моего приложения. Другими словами, я не хочу каким-то образом статически вставлять загруженные изображения и файлы в свое приложение. Итак, где я должен хранить их?

Ответ 1

Добавьте это в приложение /lib/app/endpoint.ex

plug Plug.Static,
  at: "files/", from: "/var/www/app/files/", gzip: false

и сохраните загруженные файлы в /var/www/app/files/

Файлы будут обслуживаться в http://localhost:PORT/files/

Вы можете узнать больше на https://hexdocs.pm/plug/Plug.Static.html

Кроме того, использование чего-то типа nginx для обслуживания файлов в рабочей среде может быть лучшим вариантом в зависимости от ваших требований.

Ответ 2

Прежде всего, есть два разных варианта:

  • Вы можете сохранять свои загрузки локально.
  • Вы можете хранить их на внешних сервисах, таких как Amazon S3

Выбор правильной опции зависит от вашей бизнес-логики, количества пользователей и запросов и стратегии развертывания (например, Heroku не позволяет хранить загруженные файлы на своих динамиках).

Локально

Итак, способ хранения файлов локально описан в в этой статье. Короткий ответ:

# lib/my_app/endpoint.ex

plug Plug.Static,
  at: "/uploads", from: Path.expand("./uploads"), gzip: false 

Амазонка

При работе с Amazon S3 вы все равно будете использовать arc, а базовая настройка останется такой же, как в приведенной выше статье, но все просто немного отличается и требует немного изменить конфигурацию приложения:

Добавьте {:ex_aws, "~> 0.4"}, в отпечатки. И добавьте в конфигурацию:

config :arc,
  bucket: "your-bucket",
  virtual_host: true

config :ex_aws,
  access_key_id: System.get_env("AWS_ACCESS_KEY_ID"),
  secret_access_key: System.get_env("AWS_SECRET_ACCESS_KEY"),
  s3: [
    scheme: "https://",
    host: "your-region.amazonaws.com",
    region: "your-region"
  ]

Это в основном это. См. полные инструкции по установке.

P.S. Весьма странно, что официальные документы не охватывают эту тему, я думаю, это можно было бы улучшить.