Elixir / Phoenix — удаление файла из действия контроллера после его отправки

#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 to halt(conn) для любых других, читающих это

2. Действительно, извините. Я также внес изменения в ответ.