Я пытаюсь создать новый маршрут, который позволит пользователям загружать загруженные ими файлы. Я создал этот маршрут в области "/".
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
.
Почему я получаю эту ошибку?