Skip to content
Snippets Groups Projects
Commit 260b148b authored by eal's avatar eal
Browse files

Use headers for file content type recognition.

parent fd12e585
Branches
No related tags found
No related merge requests found
......@@ -9,9 +9,8 @@ defmodule Pleroma.Upload do
File.cp!(file.path, result_file)
# fix content type on some image uploads
matches = Regex.named_captures(~r/\.(?<ext>(jpg|jpeg|png|gif))$/i, file.filename)
content_type = if file.content_type == "application/octet-stream" and matches do
if matches["ext"] == "jpg", do: "image/jpeg", else: "image/#{matches["ext"]}"
content_type = if file.content_type == "application/octet-stream" do
get_content_type(file.path)
else
file.content_type
end
......@@ -61,4 +60,30 @@ defmodule Pleroma.Upload do
defp url_for(file) do
"#{Web.base_url()}/media/#{file}"
end
def get_content_type(file) do
# PNG: 89 50 4E 47 0D 0A 1A 0A
# GIF: 47 49 46 38 37 61
# GIF: 47 49 46 38 39 61
# JPEG: FF D8 FF DB
# JPEG: FF D8 FF E0 ?? ?? 4A 46 49 46 00 01
# JPEG: FF D8 FF E1 ?? ?? 45 78 69 66 00 00
match = File.open(file, [:read], fn(f) ->
case IO.binread(f, 8) do
<<0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a>> ->
"image/png"
<<0x47, 0x49, 0x46, 0x38, _, 0x61, _, _>> ->
"image/gif"
<<0xff, 0xd8, 0xff, _, _, _, _, _>> ->
"image/jpeg"
_ ->
"application/octet-stream"
end
end)
case match do
{:ok, type} -> type
_e -> "application/octet-stream"
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment