我有一个使“ 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
如何在控制器文件中执行此操作?
答案 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
在您的控制器中。