Packages
legendary_core
8.2.5
8.12.0
8.11.1
8.11.0
8.10.0
8.9.2
8.9.1
8.5.3
8.5.2
8.5.1
8.5.0
8.4.0
8.3.6
8.3.5
8.3.4
8.3.3
8.3.2
8.3.1
8.3.0
8.2.7
8.2.5
8.2.4
8.2.3
8.2.2
8.2.1
8.2.0
8.1.1
8.1.0
8.0.1
8.0.0
7.17.12
7.17.8
7.17.7
7.17.6
7.17.5
7.17.4
7.17.3
7.17.2
7.17.1
7.17.0
7.16.12
7.16.11
4.5.4
4.0.0
2.12.0
2.11.5
2.6.0
2.4.1
2.4.0
2.3.7
2.1.2
A PETAL-stack batteries-included boilerplate for making Phoenix apps without tedium.
Current section
Files
Jump to
Current section
Files
lib/core_web/base64_uploads.ex
defmodule Legendary.CoreWeb.Base64Uploads do
@moduledoc """
Utilities for converting data uris and base64 strings to Plug.Upload structs
so they can be processed in the same way as files submitted by multipart forms.
"""
def data_uri_to_upload(str) do
{:ok, %{parsed_path: parse_result}} = URL.new(str)
case parse_result do
%{data: {:error, _}} ->
:error
%{data: data, mediatype: content_type} ->
binary_to_upload(data, content_type)
end
end
def base64_to_upload(str, content_type) do
case Base.decode64(str) do
{:ok, data} -> binary_to_upload(data, content_type)
_ -> :error
end
end
# sobelow_skip ["Traversal.FileModule"]
def binary_to_upload(binary, content_type) do
file_extension = file_extension_for_content_type(content_type)
with {:ok, path} <- Plug.Upload.random_file("upload"),
{:ok, file} <- File.open(path, [:write, :binary]),
:ok <- IO.binwrite(file, binary),
:ok <- File.close(file) do
%Plug.Upload{
path: path,
content_type: content_type,
filename: "#{Path.basename(path)}#{file_extension}"
}
end
end
defp file_extension_for_content_type(content_type) do
case MIME.extensions(content_type) do
[] -> ""
[ext | _] -> ".#{ext}"
end
end
end