Ktor 如何授权 POST 表单上传?

How to authorize POST form upload in Ktor?

我想创建一个简单的表单,用户在其中输入一些字符串(授权他们上传文件的密钥)和他们要上传的文件(没有大小限制,甚至可以是 10GB 或更多)。

我的问题是我不知道如何在接受文件之前验证代码。

到目前为止,我有此代码,即使使用有效代码也不允许任何上传,因为上传的文件似乎总是第一个要检查的表单元素。 (当我颠倒表单中元素的顺序时,这段代码根本没有处理请求)

            var isAuth = false
            multipart.forEachPart { part ->
                when (part) {
                    is PartData.FormItem -> {
                        val name = part.name
                        if(name != null && name == "key")
                            isAuth = isKeyValid(part.value)
                    }
                    is PartData.FileItem -> {
                        if(!isAuth) {
                            call.respond("Request not authorized")
                            call.response.status(HttpStatusCode.Forbidden)
                            part.dispose
                            return@forEachPart
                        }
                        if(part.originalFileName.isNullOrEmpty() || part.originalFileName!!.isBlank()) {
                            call.respond("Illegal filename")
                            call.response.status(HttpStatusCode.BadRequest)
                            return@forEachPart
                        }
                        val targetDir = File(uploadDir.path + File.separator + randomId)
                        targetDir.mkdir()
                        val targetFile = File(targetDir.path + File.separator + part.originalFileName)
                        targetFile.createNewFile()
                        sb.append(randomId)
                        sb.append("/")
                        sb.append(part.originalFileName)
                        sb.append("\n")
                        part.streamProvider().use { input -> targetFile.outputStream().buffered().use { output -> input.copyToSuspend(output) } }
                    }
                }
                part.dispose
            }

HTML 我正在使用的表格:

<html>
<body>
<form action="/upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="text" name="key">

    <input type="submit" value="upload" name="submit">
</form>
</body>
</html>
  1. 添加身份验证功能
implementation "io.ktor:ktor-auth:$ktor_version"
  1. 安装功能
install(Authentication) { //set type of authenction here }
  1. authenticate {} 块中包装您的电话
authenticate("auth") {
  post(FORM) {
  }
}

更多信息:Ktor Authentication