Elixir / Phoenix - 发送文件后从控制器操作中删除文件

Elixir / Phoenix - Deleting a file from a controller action after sending it

我有以下代码:

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

我可以预见地被告知我必须 return 来自控制器的连接。

有什么办法可以在文件发送后删除文件吗?

提前致谢

您必须从 show/1 return conn,所以这可能有效

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