Как обслуживать статическое содержимое по умолчанию в каждой подпапке с помощью ktor

#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) плагин! Спасибо.