有没有办法将上传的文件提供给用户?

时间:2016-02-20 05:29:42

标签: elixir phoenix-framework static-files

有没有办法在渲染页面中显示用户发送的图像? 我已阅读有关文件上传的this page,但将其发回用户的唯一方法是使用send_file/5,这似乎不适合在网页中呈现图片。我在考虑将文件移动到$username = $_GET['username'] ?? $_POST['username'] ?? 'sun'; $password = $_GET['password'] ?? $_POST['password'] ?? 'live'; 文件夹,但我觉得这不属于它所属的位置。

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

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

1 个答案:

答案 0 :(得分:2)

这里有两种选择。您可以直接在视图中使用内嵌数据uri(https://en.wikipedia.org/wiki/Data_URI_scheme)。这会使您的图像尺寸膨胀很多,并且最适用于小型图像,其中额外往返服务器的成本高于发送33%的通胀增加的成本。您也没有任何缓存优势,重复使用图像将导致多个副本。

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

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

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