如何在Elixir Phoenix框架中制作导出CSV控制器?

时间:2018-09-22 17:42:43

标签: csv elixir phoenix-framework

我有一个使“ 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 :(得分:2)

尝试一下:

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

在您的控制器中。