elixir - 有没有办法将上传的文件返回给用户?

标签 elixir phoenix-framework static-files

有没有办法在渲染页面中显示用户发送的图像?
我已阅读 this page关于文件上传,但将其发回用户的唯一方法是使用 send_file/5 这似乎不适合在网页中呈现图像。我正在考虑将文件移动到 assets/static文件夹,但我觉得这不是它所属的地方。

我来自 Django 世界,静态文件和上传的内容之间存在分离,我想知道 phoenix 中是否有类似的概念。

简而言之,如何渲染用户上传的图像?

最佳答案

这里有两个选项。您可以对图像进行 base64 处理并直接在您的 View 中使用内联数据 uri ( https://en.wikipedia.org/wiki/Data_URI_scheme )。这会使您的图像尺寸膨胀很多,并且仅适用于小图像,其中额外往返服务器的成本高于发送 33% 的尺寸膨胀增加的成本。您也根本得不到缓存的好处,重复使用图像将导致多个副本。

更好的选择是在你的 Controller 中创建一个新的路由和 Action 来显示图像。您需要发出正确的 content-type您的特定图像类型的标题(例如 image/png ),然后您应该使用 send_file/5 .您将使用 <img>将图像的路径标记为 src属性。您在这里获得了巨大的优势,并且可以根据自己的喜好调整所有缓存。

还有一些其他选项,例如 nginx 的 X-Accel 功能( https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/ ),您可以在其中发出该文档中给出的 header ,并且 nginx 将适本地发送文件。您仍然需要一个专用路由,并且您将从该路由 URL 发出 header 。

我不会太担心开销。 erlang VM 非常擅长管理 IO。

关于elixir - 有没有办法将上传的文件返回给用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35519545/

相关文章:

Elixir 从列表中删除重复项

elixir - 与和尝试/救援在 Elixir 中可以相同

elixir - 在没有预加载的情况下检索 Ecto 关系的 ID

phoenix-framework - phoenix 框架如何在模板中将对象呈现为 json

elixir - 如何使@current_user 在 form.html.eex 中可用?

python - 带有 Django 的 Gunicorn 给出了静态文件的问题

json - 如何使用具有正确 MIME 类型的 httprouter 提供静态文件?

search - Elixir 中最有效的区间类型搜索

debugging - 如何在phoenix/elixir中快速调试?

python - Flask:无法访问静态文件夹中的文件(404)