无法使用 Ktor 提供静态内容
Posted
技术标签:
【中文标题】无法使用 Ktor 提供静态内容【英文标题】:Cannot serve static content with Ktor 【发布时间】:2020-06-26 05:59:56 【问题描述】:我尝试使用 Route.static 函数来提供静态文件,但它不起作用。我在我的工作目录中尝试了各种组合和文件夹。现在我在资源/静态/css下有一个css,在资源/静态下有一个index.html。如果我写以下内容,我不会得到任何服务:
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false)
val client = HttpClient(Apache)
routing
static("root")
files("css")
default("index.html")
但是,我可以从这个答案:Ktor - Static content routing,写:
resource("/", "index.html")
resource("*", "index.html")
然后我会在resources/static下得到index.html。但是我不能得到任何其他东西。我在这里做错了什么?
参考:https://ktor.io/servers/features/static-content.html#specifying-files-and-folders
【问题讨论】:
【参考方案1】:最正确的静态文件配置
static
staticRootFolder = File(""/*or environment.rootPath)*/) // project root dir
files("static") // dir for all static files
在您的 server.jar
文件旁边创建一个 static
文件夹并将任何内容放在那里。
https://example.com/file.txt
https://example.com/css/style.css
https://example.com/images/image.png
另外:
tasks
val copyStatic = register("copyStatic", Copy::class)
from("$projectDir/static")
exclude("**/*.scss", "**/*.sass", "**/*.map")
into("$rootProject.buildDir/static")
"build"
dependsOn(copyStatic)
dependsOn(fatJar)
【讨论】:
为我工作。如果我从 IntelliJ IDE 运行 ktor 项目,我会在项目根级别 /static 上创建一个目录。在 /static 下,我创建了 /css 和 /js 文件夹。因此它在调试时提供静态文件。将项目导出为 .jar 时,无论在何处启动该 jar,我都需要从项目中复制并粘贴 /static 文件夹。 @MarkLapasa 只是为自动复制静态文件夹创建任务。我已经更新了我的答案【参考方案2】:假设您的项目位于 C:\ktor-project 文件夹中。如果您希望您的 Ktor 服务器使用以下 URL 并返回下面相应文件的内容,请使用底部的代码。
http://localhost:8080/root/main.css -> C:\ktor-project\css\main.css http://localhost:8080/root -> C:\ktor-project\index.html http://localhost:8080/root/styles.css -> C:\ktor-project\resources\static-resources\styles.css
static("/root")
files("css")
default("index.html")
resources("static-resources")
如果给定的 styles.css 文件是由 Gradle 构建构建的,则 resources("static-resources") 行可能是比 files("css") 行更好的选择。大多数情况下,您只需要其中一个。
【讨论】:
@user12182754 我的回答对你有帮助吗?以上是关于无法使用 Ktor 提供静态内容的主要内容,如果未能解决你的问题,请参考以下文章
从 ktor 提供 kotlin 多平台 javascript
无法在 kotlin js 中使用 ktor 客户端发布请求
Kotlin/Native 无法导入 io.ktor.network.selector.ActorSelectorManager