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

Is there a way to serve uploaded files back to the user?

有没有办法在渲染页面中显示用户发送的图片? 我读过 this page about file uploads, but the only way to send it back the user is using send_file/5,它似乎不适合在网页中呈现图像。我正在考虑将文件移动到 assets/static 文件夹,但我觉得这不是它所属的位置。

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

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

这里有两个选项。您可以对图像进行 base64,并直接在您的视图中使用内联数据 uri (https://en.wikipedia.org/wiki/Data_URI_scheme)。这会使您的图像大小增加很多,并且仅适用于小图像,其中额外 round-trip 到服务器的成本高于发送 33% 增加的 inflation 大小的成本。您也完全没有缓存优势,重复使用图像会产生多个副本。

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

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

发出 headers

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