如何在 elixir phoenix 框架中制作导出 csv 控制器?

Tae*_*Tae 4 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
Run Code Online (Sandbox Code Playgroud)

我希望我的客户点击按钮下载该文件。所以我是这样做的..

在 router.ex 中

get "/csv/:id", CsvExportController, :export
Run Code Online (Sandbox Code Playgroud)

在控制器文件中

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
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

并尝试但出现错误

no function clause matching in Plug.Conn.resp/3
Run Code Online (Sandbox Code Playgroud)

我怎样才能在控制器文件中做到这一点?

Joe*_*n29 6

尝试这个:

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

在您的控制器中。