有没有办法显示用户在渲染页面发送的图像? 我已阅读关于文件上传的this page,但发送给用户的唯一方法是使用send_file/5
,这似乎不适合在网页中呈现图像。我正在考虑将文件移动到assets/static
文件夹,但我不认为这是它属于的地方。有没有办法将上传的文件提供给用户?
我来自Django世界,静态文件和上传内容之间存在分离,我想知道并且在凤凰中有类似的概念。
总之,我该如何渲染用户上传的图片?
有没有办法显示用户在渲染页面发送的图像? 我已阅读关于文件上传的this page,但发送给用户的唯一方法是使用send_file/5
,这似乎不适合在网页中呈现图像。我正在考虑将文件移动到assets/static
文件夹,但我不认为这是它属于的地方。有没有办法将上传的文件提供给用户?
我来自Django世界,静态文件和上传内容之间存在分离,我想知道并且在凤凰中有类似的概念。
总之,我该如何渲染用户上传的图片?
这里有两个选项。您可以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。
非常好的答案,谢谢。我正在寻找一个内部机制来做到这一点,但我想我会自己做,并会在路上学到很多东西。 – Paco
你有没有像前面的nginx一样的web服务器?您可以直接从Web服务器上传用户上传的内容,方法是将文件移动到指定的目录并从那里提供。 –
我不想这样做,因为我无法按照自己想要的方式提供服务,即我无法动态管理可以在后端逻辑中访问文件的人员。所有文件都可以供所有用户使用。 – Paco
所以这意味着对上传文件的请求必须通过phoenix,这只会让您选择使用send_file。 –