Есть ли способ вернуть загруженные файлы пользователю?

Есть ли способ отображать изображения, отправленные пользователями, на обработанной странице? Я прочитал эту страницу о загрузке файлов, но это единственный способ отправить его обратно пользователь использует send_file/5, который не подходит для изображений для рендеринга в страница в Интернете. Я думал переместить файл в папку assets/static, но не думаю, что это место, где он находится.

Я пришел из мира Django, и было разделение между статическими файлами и загруженным контентом, и мне было интересно, была ли аналогичная концепция в Phoenix.

Короче говоря, как я могу визуализировать изображение, загруженное пользователем?


person Paco    schedule 20.02.2016    source источник
comment
У вас есть веб-сервер вроде nginx впереди? Вы можете обслуживать загруженный пользователем контент непосредственно с веб-сервера, перемещая файлы в указанный каталог и обслуживая их оттуда.   -  person Patrick Oscity    schedule 20.02.2016
comment
Я не хочу этого делать, потому что у меня не будет возможности обслуживать его так, как я хочу, то есть я не смогу динамически управлять доступом к файлу в логике серверной части. Таким образом, все файлы будут доступны всем пользователям.   -  person Paco    schedule 20.02.2016
comment
Таким образом, это означает, что запрос к загруженному файлу должен проходить через Phoenix, что оставляет вам только возможность использовать send_file.   -  person Patrick Oscity    schedule 20.02.2016
comment
Голосование за закрытие - широкий вопрос.   -  person Onorio Catenacci    schedule 20.02.2016


Ответы (1)


Здесь есть два варианта. Вы можете использовать base64 изображение и использовать встроенный URI данных (https://en.wikipedia.org/wiki/Data_URI_scheme) прямо перед вами. Это немного увеличивает размер вашего изображения и лучше всего подходит только для небольших изображений, когда стоимость дополнительного обращения к серверу превышает стоимость отправки 33% увеличенного размера инфляции. Вы также не получаете никаких преимуществ кэширования, а повторное использование изображения приведет к созданию нескольких копий.

Лучшим вариантом является создание нового маршрута и действия в вашем контроллере для отображения изображения. Вам нужно создать правильный заголовок content-type для вашего конкретного типа изображения (например, image/png), а затем вы должны использовать send_file/5. Вы должны использовать тег <img> с маршрутом для изображения в качестве атрибута src. Здесь вы получаете огромное преимущество и можете настроить все кеширование на свое усмотрение.

Есть и другие варианты, например, функция X-Accel в nginx (https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/), где вы должны выдать заголовки, указанные в этой документации, и nginx отправит файл соответствующим образом. Вам по-прежнему понадобится выделенный маршрут, и вы будете передавать заголовки из этого маршрутизируемого URL-адреса.

Я бы не стал слишком беспокоиться о накладных расходах. Виртуальная машина erlang неплохо справляется с управлением вводом-выводом.

person asonge    schedule 20.02.2016
comment
Очень хороший ответ, спасибо. Я искал внутренний механизм, который сделал бы это, но думаю, что сделаю это сам и многому научусь на этом пути. - person Paco; 21.02.2016