нет соответствия предложения функции в Plug.Conn.send_file / 5

Я пытаюсь создать новый маршрут, который позволит пользователям загружать загруженные ими файлы. Я создал этот маршрут в области "/".

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

Когда я пытаюсь загрузить URL /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

Я не понимаю, почему я получаю эту ошибку. В документации точно сказано:

отправьте его обратно клиенту с помощью Plug.Conn.send_file/5.

Почему я получаю эту ошибку?


person Paco    schedule 23.02.2016    source источник


Ответы (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                                                  
person Paco    schedule 23.02.2016
comment
Чтобы добавить к этому ответу, ввод этой функции на странице документации говорит: имя_файла :: двоичный. - person Cody Poll; 23.02.2016