Как обслуживать статические файлы с помощью Vapor?

Я пытаюсь написать приложение на стороне сервера, используя Swift и Vapor Framework. Однако я не могу понять, как обслуживать статические файлы с помощью Vapor. Недостаточно просто переместить их в Public или же Resources каталог.

Как я могу это сделать?

UPD. Я выполнил шаги, которые предложил Таннер Нельсон, но это все еще не работает.

Что я пробовал до сих пор:

  1. vapor build а также vapor run (используя Vapor Toolbox v0.6.1).

  2. ./build/debug/App из корневого каталога (который содержит Package.swift).

  3. Запустите бета-версию 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).

Рабочий каталог Xcode

Чтобы исправить при запуске из командной строки, убедитесь, что вы запускаете приложение из корневого каталога. команда запуска должна выглядеть примерно так .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")
  )
}
Другие вопросы по тегам