你如何处理Elixir中的base64编码文件?

时间:2016-08-19 04:32:01

标签: erlang elixir phoenix-framework

我正在尝试弄清楚如何使用现有的JSON API来客户端上传base64编码的图像,例如:

data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

...并将其转换为文件,以便在arc库中进行处理。

你应该如何解码并将其变成可用的文件?

2 个答案:

答案 0 :(得分:9)

第一步是提取Base 64数据。然后,您可以使用xterm-256color<body> <img src="favicon-32x32.png" height="32" width="32" /> <body>

如果您确保只获得Base.decode64!/1,则可以执行以下操作:

File.write!/2

或者如果您只保证获得image/gif任何文件类型,您可以这样做:

iex(1)> input = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
iex(2)> "data:image/gif;base64," <> raw = input
iex(3)> raw
"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
iex(4)> File.write!("a.gif", Base.decode64!(raw))
:ok

这两个片段都会将文件写入base64,您可以将其用于任何您想要的内容。如果你想创建临时图像,我建议将它们存储在iex(1)> input = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" iex(2)> {start, length} = :binary.match(input, ";base64,") {14, 8} iex(3)> raw = :binary.part(input, start + length, byte_size(input) - start - length) "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" iex(4)> File.write!("a.gif", Base.decode64!(raw)) :ok 内的某个位置,然后在使用后删除它们。

答案 1 :(得分:2)

看起来以下情况可能有效:

{:ok, file} = File.open "test.gif", [:write]
{:ok, image_string} = Base.decode64("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")
IO.binwrite file, image_string

如果有人有比这更好的解决方案,我会把它留在这里,但这似乎至少可以完成这项工作。