akkoma/lib/pleroma/uploaders/s3.ex

49 lines
1.2 KiB
Elixir
Raw Normal View History

2018-08-28 01:20:54 +00:00
defmodule Pleroma.Uploaders.S3 do
@behaviour Pleroma.Uploaders.Uploader
2018-11-23 16:40:45 +00:00
require Logger
# The file name is re-encoded with S3's constraints here to comply with previous links with less strict filenames
def get_file(file) do
config = Pleroma.Config.get([__MODULE__])
{:ok,
{:url,
Path.join([
Keyword.fetch!(config, :public_endpoint),
Keyword.fetch!(config, :bucket),
strict_encode(URI.decode(file))
])}}
end
2018-08-28 01:20:54 +00:00
2018-11-23 16:40:45 +00:00
def put_file(name, uuid, path, content_type, _opts) do
config = Pleroma.Config.get([__MODULE__])
bucket = Keyword.get(config, :bucket)
2018-08-28 01:20:54 +00:00
{:ok, file_data} = File.read(path)
File.rm!(path)
2018-11-23 16:40:45 +00:00
s3_name = "#{uuid}/#{strict_encode(name)}"
2018-08-28 01:20:54 +00:00
2018-11-23 16:40:45 +00:00
op =
2018-08-28 01:20:54 +00:00
ExAws.S3.put_object(bucket, s3_name, file_data, [
{:acl, :public_read},
{:content_type, content_type}
])
2018-11-23 16:40:45 +00:00
case ExAws.request(op) do
{:ok, _} ->
{:ok, {:file, s3_name}}
2018-11-23 16:40:45 +00:00
error ->
Logger.error("#{__MODULE__}: #{inspect(error)}")
{:error, "S3 Upload failed"}
end
2018-08-28 01:20:54 +00:00
end
2018-11-23 16:40:45 +00:00
@regex Regex.compile!("[^0-9a-zA-Z!.*/'()_-]")
def strict_encode(name) do
String.replace(name, @regex, "-")
end
2018-08-28 01:20:54 +00:00
end