我正在尝试弄清楚如何使用现有的JSON API来客户端上传base64编码的图像,例如:
data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
...并将其转换为文件,以便在arc
库中进行处理。
你应该如何解码并将其变成可用的文件?
答案 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
如果有人有比这更好的解决方案,我会把它留在这里,但这似乎至少可以完成这项工作。