image - Phoenix 灵药二进制数据图像

标签 image elixir phoenix-framework bytea

我使用 phoenix 框架创建一个网页并创建一个上传表单,以便用户可以上传个人资料图片。

    def update(conn, %{"id" => id, "user" => %{"photo" => file}}) do
     if(File.exists?(file.path)) do

     case File.read(file.path) do
      {:ok, body}      -> data = IO.iodata_to_binary(body)
                          changeset = Whiteboard.File.changeset(%Whiteboard.File{}, %{user_id: currentuser.id, name: file.filename , data: data})

这样就可以了,二进制数据在数据库中以 bytea/binary 形式存在。

现在我的问题:如何渲染 phoenix html.eex 文件中的二进制数据以再次显示图像?

编辑:找到一个解决方案

def render("image.html", %{:height => height, :width => width, :data =>   data, :datatype => datatype}) do
  pic = Base.encode64(data)

Phoenix.HTML.raw("<img src=\"data:image/"<>datatype<>";base64,"<>pic<>"\" height=\""<>height<>"\" width=\""<>width<>"\">")

end

最佳答案

虽然浏览器支持添加 base64 图像 URL,但我建议您采用缓存更容易使用的传统方法,并创建一个新的 Phoenix 路由来提供图像。

为此,您只需发出正确的 mime 类型 header ,并且无需渲染模板,只需将列的内容直接放入连接中即可。

您可能应该检查前几个字节,看看它是否与已知格式的白名单匹配。您可以在此处搜索这些字节的内容:http://www.garykessler.net/library/file_sigs.html

关于image - Phoenix 灵药二进制数据图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35386707/

相关文章:

docker - 运行 Elixir 容器 Bootstrap 时出现错误加载模块 pooler_app,我该如何解决?

azure - Microsoft Azure 上的 phoenix API 的 RBAC

elixir - 如何从 Elixir 中的回调访问超出范围的变量

c++ - 如何从 Qt 中的文件加载图像?

java - 当我使用自己的多种方法来绘制图像时出现 NullpointerException

html - 为什么 Chrome 的 img 元素的 onerror 事件只触发一次?

elixir - 如何将实例方法添加到 Phoenix 的模型中?

elixir - 如何阻止 Elixir 将\n 解释为文档字符串中的换行符?

elixir - Phoenix Framework 1.4 版本中的 models 文件夹在哪里?

java - Bitmap.Config.HARDWARE 与 Bitmap.Config.RGB_565