在Plug.Conn.send_file / 5中没有匹配的函数子句

时间:2016-02-23 05:15:05

标签: controller elixir phoenix-framework

我正在尝试创建一条新路线,允许用户下载他们上传的文件。我在" /"下创建了这条路线。范围。

get "/media/:filepath", MediaFilesController, :download

目前,我只是尝试发送位于项目根目录的文件夹uploads中的图像。简而言之,如果有人试图访问/media/file.png,则会发送位于<project_folder>/uploads/file.png的文件。这是代码:

defmodule App.MediaFilesController do
  use App.Web, :controller
  import Plug.Conn

  @media_folder "/uploads"

  def download(conn, %{"filepath" => filepath}) do
    path = "#{System.cwd}/#{@media_folder}/#{filepath}"
    {:ok, file} = File.open(path)
    conn
    |> put_resp_content_type("image/png")
    |> send_file(200, file)
  end
end

当我尝试加载网址/media/file.png时,我收到此错误:

[error] #PID<0.579.0> running App.Endpoint terminated Server: localhost:4000 (http) Request: GET /media/file.png
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in Plug.Conn.send_file/5

我不明白为什么我会收到此错误。 documentation正好说:

  

使用Plug.Conn.send_file/5将其发回给客户。

为什么我收到此错误?

1 个答案:

答案 0 :(得分:1)

send_file/5需要一个路径,而不是文件。

所以最后,函数看起来像这样:

def download(conn, %{"filepath" => filepath}) do     
  path = "#{System.cwd}/#{@media_folder}/#{filepath}"
  conn                                               
  |> put_resp_content_type("image/png")              
  |> send_file(200, path)                            
end