Как обслуживать статические файлы с помощью Vapor?
Я пытаюсь написать приложение на стороне сервера, используя Swift и Vapor Framework. Однако я не могу понять, как обслуживать статические файлы с помощью Vapor. Недостаточно просто переместить их в Public
или же Resources
каталог.
Как я могу это сделать?
UPD. Я выполнил шаги, которые предложил Таннер Нельсон, но это все еще не работает.
Что я пробовал до сих пор:
vapor build
а такжеvapor run
(используя Vapor Toolbox v0.6.1)../build/debug/App
из корневого каталога (который содержитPackage.swift
).Запустите бета-версию Xcode 8 после редактирования схемы, как предложил Таннер Нельсон.
Во всех этих случаях я получаю ошибку {"error":true,"message":"Page not found"}
У меня есть файл vapor_logo.png
внутри Public
папка, а также тот же файл внутри Public/images/
папка. Я пытаюсь запросить это, и это не удается. Запросы, которые я сделал: http://localhost:8080/image/vapor_logo.png
а также http://localhost:8080/vapor_logo.png
, Тем не менее, другие маршруты работают нормально.
UPD 2. Ну, это были все мои ошибки. Во-первых, файл, который я думаю, назывался vapor_logo.png
на самом деле назывался vapor-logo.png
, Во-вторых, дело имеет значение, когда вы делаете запрос. Я также пытался запросить файл с именем IMG_8235.JPG
но напишите расширение файла как jpg
, так что получил ошибку.
Итак, просто напомнить: если у вас возникла та же проблема, что и у меня, следуйте ответу Таннера Нельсона и убедитесь, что имя запрашиваемого файла точно совпадает с именем файла на диске.
2 ответа
Структура папок Vapor из Документов:
.
├── App
│ └── main.swift
│ └── ...
├── Public
├── Resources
└── Package.swift
Любые файлы в Public
папка будет обслуживаться по умолчанию, если не было зарегистрировано ни одного маршрута, конфликтующего с именем файла.
Например, если у вас есть файл Public/foo.png
и следующее main.swift
файл:
import Vapor
let drop = Droplet()
drop.get("welcome") { request in
return "Hello, world"
}
drop.serve()
Запрос к localhost/welcome
вернется "Hello, world"
и просьба к localhost/foo.png
вернется foo.png
,
Если это не работает должным образом, вероятно, ваш рабочий каталог не настроен должным образом. Это может произойти, если вы запускаете свой проект из Xcode или запускаете его из командной строки из папки, которая не является корневым каталогом проекта.
Чтобы исправить Xcode, перейдите на Schemes > App > Edit Scheme > Run > Options > Working Directory > [x] Use Custom Working Directory
и убедитесь, что каталог установлен в корневой каталог вашего проекта (где находится Package.swift).
Чтобы исправить при запуске из командной строки, убедитесь, что вы запускаете приложение из корневого каталога. команда запуска должна выглядеть примерно так .build/debug/App
так как .build
папка находится в корневом каталоге.
Для меня это было раскомментировать эту строку в configure.swift
:
middlewares.use(FileMiddleware.self) // Serves files from `Public` directory
В дополнение к ответу сFileMiddleware
, иногда нужно обслуживать конкретный файл, а не весь Public
каталог, где используется request.fileio.streamFile
может помочь:
app.get("file") { (request: Request) in
// stream the file
request.eventLoop.makeSucceededFuture(
request.fileio.streamFile(at: "/your/filepath")
)
}