#elixir #phoenix-framework
#elixir #phoenix-framework
Вопрос:
У меня есть следующий код:
def show(conn) do
conn
|> put_resp_header("content-disposition", ~s(attachment; filename="tmp.png"))
|> Plug.Conn.send_file(200, "tmp.png")
end
Я пытаюсь удалить tmp.png
файл после его отправки, однако, если я
def show(conn) do
conn
|> put_resp_header("content-disposition", ~s(attachment; filename="tmp.png"))
|> Plug.Conn.send_file(200, "tmp.png")
File.rm("tmp.png")
end
Мне предсказуемо сказали, что я должен вернуть соединение с контроллера.
Есть ли какой-либо способ удалить файл после отправки файла?
Заранее спасибо
Ответ №1:
Вы должны вернуться conn
из show/1
, так что это, вероятно, сработает
def show(conn) do
conn =
conn
|> put_resp_header("content-disposition", ~s(attachment; filename="tmp.png"))
|> Plug.Conn.send_file(200, "tmp.png")
File.rm("tmp.png")
halt(conn)
end
Другим, наиболее, вероятно, надежным способом сделать это, было бы запустить отдельный процесс для удаления файла.
defp send_and_remove_file(conn, file) do
conn = Plug.Conn.send_file(conn, 200, "tmp.png")
spawn(File, :rm, [file])
halt(conn)
end
def show(conn) do
conn
|> put_resp_header("content-disposition", ~s(attachment; filename="tmp.png"))
|> send_and_remove_file("tmp.png")
end
Комментарии:
1. Спасибо — мне пришлось изменить последнюю строку
send_and_remove_file
tohalt(conn)
для любых других, читающих это2. Действительно, извините. Я также внес изменения в ответ.