【问题标题】:Is there a way to serve uploaded files back to the user?有没有办法将上传的文件返回给用户?
【发布时间】:2016-02-20 05:29:41
【问题描述】:

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

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

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

【问题讨论】:

  • 你前面有nginx这样的web服务器吗?您可以通过将文件移动到指定目录并从那里提供它们来直接从 Web 服务器提供用户上传的内容。
  • 我不想这样做,因为我无法按照我想要的方式提供服务,即我将无法动态管理谁可以在后端逻辑中访问文件。所以所有文件都对所有用户可用。
  • 所以这意味着对上传文件的请求必须通过 phoenix,这使您只能选择使用 send_file。
  • 投票结束 - - 广泛的问题。

标签: elixir phoenix-framework static-files


【解决方案1】:

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

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

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

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

【讨论】:

  • 很好的答案,谢谢。我一直在寻找一种内部机制来做到这一点,但我想我会自己做,并且会在路上学到很多东西。
猜你喜欢
  • 2014-12-17
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2021-08-21
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多