Serving Static Content

预计阅读时间:3分钟

Ktor具有对提供静态内容的内置支持. 当您要提供样式表,脚本,图像等时,这很有用.

此功能在io.ktor.routing.Routing类中io.ktor.routing.Routing ,不需要其他工件.

Specifying Files and Folders

使用static函数,我们可以告诉Ktor我们希望将某些URI视为静态内容,并定义该内容所处的位置. 所有内容均相对于当前工作目录. 请参阅定义自定义根文件夹以设置其他根.

routing {
    static("static") {
        files("css") 
    }
}

上面的示例告诉ktor ,对URI /static任何请求都将被视为静态内容. files("css")定义了这些文件所在的文件夹-将提供css文件夹中的所有内容. 从本质上讲,这意味着诸如

/static/styles.css将提供文件css/styles.css .

除了文件夹之外,我们还可以使用file包含特定文件,如果文件名不同,则可以选择第二个参数映射到实际的物理文件名.

routing {
    static("static") {
        files("css")
        files("js")
        file("image.png")
        file("random.txt", "image.png")
        default("index.html")
    }
}

我们还可以有一个可以使用默认提供的文件default . 例如,在致电时

/static没有文件名,将提供index.html .

Defining a custom root folder

要指定一个不同于工作目录的根文件夹,我们设置staticRootFolder的值,该值需要为File类型.

static("custom") {
    staticRootFolder = File("/system/folder/docs")
    files("public")
}

Defining subroutes

We can also define sub-routes, i.e. /static/themes for instance

static("static") {
    files("css")
    static("themes") {
        files("data")
    }
}

Serving embedded resources

如果将静态内容作为资源嵌入到应用程序中,则可以使用resourceresources功能从那里直接为它们提供服务:

static("static") {
    resources("css")
    resource("favicon.ico")
}

还有一个类似于default defaultResource ,用于为文件夹提供默认页面;提供与staticBasePackage相似的staticRootFolder ,用于为静态内容指定基本资源包.

Handling Errors

如果找不到请求的内容,则抛出FileNotFoundException . 应该在StatusPages使用exception处理程序对其进行处理,以生成相应的404 Not Found ,否则它将传播到引擎并导致500 Internal Server Error.

Customising Content Types

提供文件后,将使用ContentType.defaultForFile(file)从文件扩展名确定内容类型. 从ktor-server-coremimelist.csv资源文件获取与每种文件类型相对应的数据.

Under the covers

函数static定义为

fun Route.static(remotePath: String, configure: Route.() -> Unit) = route(remotePath, configure)

这实际上只是另一条路线定义.

Handling HEAD requests in static content

默认情况下,Ktor不处理HEAD请求,因此静态内容功能也不处理HEAD请求. 要自动处理每个GET路由的HEAD请求,可以安装AutoHeadResponse功能 .

fun Application.main() {
    // ...
    install(AutoHeadResponse) 
    // ...
}

默认情况下不处理HEAD请求,这意味着如果将curl -I或其curl --head别名用于Ktor后端的GET路由而不安装AutoHeadResponse功能, 它将返回404 Not Found .

by  ICOPY.SITE