# Upload ,ecto ,elixir graphql

**URL:** <https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234>\
**Category:** Questions\
**Tags:** ecto, absinthe, file-uploading\
**Created:** [May 4, 2020, 2:05pm UTC](https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234 "2020-05-04T14:05:29Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![NewBee](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/newbee/32/19226_2.png) [@NewBee](https://forum.elixirforum.com/u/NewBee)\
**Post date:** [May 4, 2020, 2:05pm UTC](https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234/1 "2020-05-04T14:05:29Z")

</div>

I have created my schema , my table expenses and all it contains an attribut document with type string , I want to use as a :upload and test it via graphiql  
I did that in my mutation to create expense : .

```elixir
arg(:file_upload, non_null(:upload))
resolve(fn args, _ ->
  # this is a `%Plug.Upload{}` struct. A server (a GenServer specifically) that manages uploaded files.
  args.file_upload
  {:ok, "success"}
end)

```

I did a test in graphiql but it returns argument fileUpload an invalide Value

---

<div class="post-metadata">

**Author:** ![benwilson512](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/benwilson512/32/1457_2.png) [@benwilson512](https://forum.elixirforum.com/u/benwilson512)\
**Post date:** [May 4, 2020, 2:13pm UTC](https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234/2 "2020-05-04T14:13:21Z")

</div>

GraphiQL does not support file uploads at this time.

---

<div class="post-metadata">

**Author:** ![NewBee](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/newbee/32/19226_2.png) [@NewBee](https://forum.elixirforum.com/u/NewBee)\
**Post date:** [May 4, 2020, 2:22pm UTC](https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234/3 "2020-05-04T14:22:21Z")

</div>

do you have a suggestion please?

---

<div class="post-metadata">

**Author:** ![NewBee](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/newbee/32/19226_2.png) [@NewBee](https://forum.elixirforum.com/u/NewBee)\
**Post date:** [May 4, 2020, 2:28pm UTC](https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234/4 "2020-05-04T14:28:00Z")

</div>

even my curl Command curl -X POST -F query=“mutation { CreateExpense(file\_upload "Elixir\_in\_Action")}” -F Elixir\_in\_Action=@Elixir\_in\_Action.pdf localhost:80/graphql  
returns curl -X POST -F query=“mutation { createExpense(file\_upload: "Elixir\_in\_Action")}” -F Elixir\_in\_Action=@Elixir\_in\_Action.pdf localhost:80/graphql  
Warning: setting file Elixir\_in\_Action.pdf failed!

404 Not Found
# 404 Not Found

* * *
nginx/1.16.0

---

<div class="post-metadata">

**Author:** ![benwilson512](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/benwilson512/32/1457_2.png) [@benwilson512](https://forum.elixirforum.com/u/benwilson512)\
**Post date:** [May 4, 2020, 2:57pm UTC](https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234/5 "2020-05-04T14:57:16Z")

</div>

If you’re getting a 404 this means that the route is not found. Do you have a `/graphql` route defined in your router?

---

<div class="post-metadata">

**Author:** ![NobbZ](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/nobbz/32/27235_2.png) [@NobbZ](https://forum.elixirforum.com/u/NobbZ)\
**Post date:** [May 4, 2020, 3:19pm UTC](https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234/6 "2020-05-04T15:19:23Z")

</div>

Are you sure you configured your nginx correctly? I find it quite uncommon that it shows its 404 instead of phoenix’…

---

<div class="post-metadata">

**Author:** ![darkblueorange](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/darkblueorange/32/28418_2.png) [@darkblueorange](https://forum.elixirforum.com/u/darkblueorange)\
**Post date:** [May 4, 2020, 4:07pm UTC](https://forum.elixirforum.com/t/upload-ecto-elixir-graphql/31234/7 "2020-05-04T16:07:36Z")

</div>

Here is a quick (& dirty) implementation :

In schema

```elixir
  object :governance_mutations do
    @desc "Upload a file"
    field :upload_file, :string do
      arg :file_data, non_null(:upload)
      resolve(&Resolvers.GovernanceResolver.upload_file/2)
    end

```

In resolver :

```elixir
  def upload_file(%{file_data: %Plug.Upload{content_type: _content, filename: orig_filename, path: path_to_filename} = _args}, _) do
    Governances.upload_on_request_type(orig_filename, path_to_filename)
    {:ok, "success"}
  end

```

Then :

```elixir
  def upload_on_request_type(orig_filename, path_to_filename) do
    case File.read(path_to_filename) do
        {:ok, contents} ->
                Logger.info("Reading file succeeded")
                %RequestType{}
                |> RequestType.changeset(%{name: "Photo", business_line_id: "1", file_data: contents})
                |> Repo.insert()

                {:ok, "Success"}

        {:error, reason} ->
                Logger.info("File reading error : #{inspect(reason)}")
                {:error, reason}
    end
  end

```

We need to tell Postgres to accept binary stuff before (otherwise simply copy paste the file elsewhere is filesystemstorage is ok, or even sending it to any bucket).

Thank you @benwilson512 by the way for this really really awesome work 😃
