Как сделать экспорт csv контроллера в фреймворк elixir phoenix? - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть функция, которая делает "contacts.csv" следующим образом.

def write(people) do
    [["name", "phone_number"]]
    |> Stream.concat(people |> Stream.map(&[&1.name, Formatter.remove_international_code(&1.phone_number)]))
    |> CSV.encode()
    |> Enum.into(File.stream!("contacts.csv"))
end

, и я хочу, чтобы мой клиент нажимал кнопку, чтобы загрузить этот файл.Поэтому я сделал это следующим образом ..

В router.ex

get "/csv/:id", CsvExportController, :export

В файле контроллера

def export(conn, %{"id" => phonebook_id}) do
    conn
    |> put_resp_content_type("text/csv")
    |> put_resp_header("content-disposition", "attachment; filename=\"contacts.csv\"")
    |> send_resp(200, export_contacts_from_phonebook(phonebook_id))
  end

  def export_contacts_from_phonebook(phonebook_id) do
    Contact.get_people(phonebook_id)
    |> CsvFormatter.write()
  end

в CsvFormatter.ex

def write(people) do
    [["name", "phone_number"]]
    |> Stream.concat(people |> Stream.map(&[&1.name, Formatter.remove_international_code(&1.phone_number)]))
    |> CSV.encode()
    |> Enum.sort()
    |> Enum.into(File.stream!("contacts.csv"))
end

и попытался, но получил ошибку

no function clause matching in Plug.Conn.resp/3

как я могу сделать это в файле контроллера?

1 Ответ

0 голосов
/ 22 сентября 2018

Попробуйте:

def export(conn, %{"id" => phonebook_id})
  send_download(
    conn,
    {:binary, export_contacts_from_phonebook(phonebook_id)},
    content_type: "application/csv",
    filename: "download.csv"
  )
end

в вашем контроллере.

...