#ktor
#ktor
Вопрос:
У меня есть статический маршрут, который работает нормально, но я хотел бы добавить документ по умолчанию для любых / всех вложенных папок — по умолчанию, похоже, можно использовать только фиксированный файл, без возможности попросить его посмотреть в каталоге запросов.
Следующее будет обслуживать любой статический файл в каталоге «/ export», когда запрашивается «/ export / …», но если он не найден, то файл » /index.html » всегда возвращается вместо «export/…/index.html «.
static("export") {
files("export")
default("index.html")
}
Есть ли какой-нибудь способ определить это? Похоже, это стандартная функция для веб-сервера, поэтому я, возможно, просто пропустил что-то очевидное…
Комментарии:
1. Вы когда-нибудь находили решение? Это все еще проблема с Ktor 2.1.0.
2. К сожалению, пока нет.
Ответ №1:
default()
по какой-либо причине обрабатывает только папку верхнего уровня. Вы можете заменить files()
default()
пару и пользовательским расширением, выглядящим следующим образом:
fun Route.filesWithDefaultIndex(dir: File) {
val combinedDir = staticRootFolder?.resolve(dir) ?: dir
get("{static_path...}") {
val relativePath = call.parameters
.getAll("static_path")
?.joinToString(File.separator) ?: return@get
val file = combinedDir.combineSafe(relativePath)
val fallbackFile = file.combineSafe("index.html")
val localFile = when {
file.isFile -> file
file.isDirectory amp;amp; fallbackFile.isFile -> fallbackFile
else -> return@get
}
call.respond(LocalFileContent(localFile, ContentType.defaultForFile(localFile)))
}
}
По сути, это разрешает локальный файл, соответствующий запрошенному пути, обслуживает его, если это обычный файл, или обслуживает его index.html
(если он присутствует), если это каталог. В противном случае он делегирует обработку ошибок Ktor (вероятно, возвращает 404).
Я также написал здесь немного более подробное объяснение этого решения.
Комментарии:
1. Хорошо, я собирался спросить о конечной косой черте, но потом я прочитал ваш блог и добавил
install(IgnoreTrailingSlash)
плагин! Спасибо.