Введение

В этой серии постов будет показано, как загружать файлы на сервер с помощью bsinthe GraphQL, React и Apollo.

Часть 1 посвящена реализации на стороне сервера.

Если у вас уже настроен Absinthe, просто перейдите в конец файла schema.ex. В противном случае, вот пошаговое руководство по настройке и запуску вашего сервера загрузки файлов GrahpQL.

Создать новый проект с

mix phoenix.new file_upload --no-brunch --no-ecto

Добавьте абсент в файл mix.exs, он должен выглядеть примерно так:

Теперь нам нужно предоставить конечную точку для graphql на нашем сервере. Мы делаем это, добавляя следующий код в router.ex.

Как обычно, нам нужно добавить мутацию загрузки в нашу схему. Вы можете следовать классной документации абсента о том, как создавать и обрабатывать вашу схему, но для наших целей это будет выглядеть так:

Запустите сервер и проверьте его с помощью команды curl:

curl -X POST -F query="mutation { uploadFile(file_data: \"users_csv\")}" -F users_csv=@users.csv localhost:4000/graphql

Вы должны увидеть что-то вроде этого:

%{
  file_data: %Plug.Upload{
    content_type: "application/octet-stream",
    filename: "file_data.csv",
    path: "/var/folders/61/2h5x_5x55hz6lsvvxhlcy5040000gn/T//plug-1538/multipart-1538459997-950174554749088-3"
  }
}

Еще лучше добавить для этого подходящий тест.

Вы увидите, что этот тест немного отличается от других тестов на мутацию абсента. Обычно мы передаем информацию в абсент, просто используя атрибутvariables. Вместо этого в случае загрузки файлов данные файла передаются по другому атрибуту. Обратите внимание, что file_data_arbitrary_name может иметь любое другое имя, если оно совпадает.

Если вы дошли до этого момента, поздравляем !! Ваш сервер GraphQL для загрузки файлов готов.

Вы можете проверить github, чтобы получить код. Увидимся с частью 2!