无法使用 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.txthttps://example.com/css/style.csshttps://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

KTor 站点无法访问

无法在 kotlin js 中使用 ktor 客户端发布请求

Kotlin/Native 无法导入 io.ktor.network.selector.ActorSelectorManager

Spring Boot 2 和 Security With JWT 无法提供 Angular 构建的静态内容

无法将 io.ktor 导入 Android Studio 中 KMM 的通用模块