2016-02-20 174 views
4

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

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

总之,我该如何渲染用户上传的图片?

+0

你有没有像前面的nginx一样的web服务器?您可以直接从Web服务器上传用户上传的内容,方法是将文件移动到指定的目录并从那里提供。 –

+0

我不想这样做,因为我无法按照自己想要的方式提供服务,即我无法动态管理可以在后端逻辑中访问文件的人员。所有文件都可以供所有用户使用。 – Paco

+0

所以这意味着对上传文件的请求必须通过phoenix,这只会让您选择使用send_file。 –

回答

2

这里有两个选项。您可以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虚拟机非常适合管理IO。

+0

非常好的答案,谢谢。我正在寻找一个内部机制来做到这一点,但我想我会自己做,并会在路上学到很多东西。 – Paco

相关问题