robert

robert

Upload pdf and images using Arc

Hi,
I’m trying to use arc to upload to s3, but facing some issues in the road.
Here what happens, if I upload {jpg, png, etc…} I want arc to run some transform on it before saving.
However that’s not the case for a pdf file. Could someone give me some direction?
My goal is to put both validate in a single file

arc: 0.11.0
arc_ecto: 0.11.1
phoenix: 1.4.0

Here is the code:

defmodule Cidades.AnexoUploader do
  use Arc.Definition
  use Arc.Ecto.Definition

  @versions [:original, :thumb, :mini_thumb]
  @extension_whitelist ~w(.jpg .jpeg .gif .png .pdf)

  #def acl(:thumb, _), do: :public_read
  @acl :public_read

  def validate({file, _}) do
    file_extension = file.file_name |> Path.extname |> String.downcase
    Enum.member?(@extension_whitelist, file_extension)

    cond do
      not (~w(.pdf) |> Enum.member?(Path.extname(file.file_name))) -> transform(:thumb, {file})
      (~w(.pdf) |> Enum.member?(Path.extname(file.file_name))) -> {:ok}
    end

  end

  def transform(:thumb, {file, _scope}) do
    {:convert, "-strip -thumbnail x500^ -gravity center -extent x500 -format jpg", :jpg}
  end

  def transform(:mini_thumb, {file, _scope}) do
    {:convert, "-strip -thumbnail 200x200^ -gravity center -extent 200x200 -format jpg", :jpg}
  end

  def filename(version, {_file, _scope}) do
    #file_name = Path.basename(file.file_name, Path.extname(file.file_name))
    #"#{version}_#{:os.system_time}"
    #"#{scope.uuid}_#{version}_#{file_name}"
    "#{version}"
  end

  # Override the storage directory:
  def storage_dir(_version, {_file, scope}) do
    IO.inspect(scope)
    "uploads/#{scope.uuid}"
    #"#{String.downcase(scope.tipo)}/#{scope.mun.cnpj}/#{scope.uuid}"
  end

#  def __storage do
#    case Mix.env do
#      :dev  -> Arc.Storage.Local
#      :test -> Arc.Storage.Local
#      _     -> Arc.Storage.S3
#    end

  #delete all versions of an avatar
  #def remove(scope) do
  #  storage_dir(nil, {scope.avatar, scope}) |> File.rm_rf!
  #end

  # Provide a default URL if there hasn't been a file uploaded
  # def default_url(version, scope) do
  #   "/images/avatars/default_#{version}.png"
  # end

  # Specify custom headers for s3 objects
  # Available options are [:cache_control, :content_disposition,
  #    :content_encoding, :content_length, :content_type,
  #    :expect, :expires, :storage_class, :website_redirect_location]
  #
  # def s3_object_headers(_version, {file, _scope}) do
  #   [content_type: MIME.from_path(file.file_name)]
  # end
end

How can I solve this?
Newcomer to forum, sorry for any miss…
arc, arc_ecto

Most Liked

OvermindDL1

OvermindDL1

First this isn’t doing anything, I think you want to return if it fails or something?

Second, you seem to be calling transform from your validate function, this check should probably belong in the transform functions themselves?

Third, no need to duplicate the test:

    cond do
      not (~w(.pdf) |> Enum.member?(Path.extname(file.file_name))) -> {:convert, "blah"}
      true -> :whatever_it_was_to_ignore
    end

Etc to start with. :slight_smile:

robert

robert

thank you, I’ll try to use your tips to start with :slight_smile:

Where Next?

Popular in Questions Top

vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New

Other popular topics Top

hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

We're in Beta

About us Mission Statement