Upload pdf and images using Arc

arc
arc_ecto

#1

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


#2

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:


#3

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