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>
- 添加身份验证功能
implementation "io.ktor:ktor-auth:$ktor_version"
- 安装功能
install(Authentication) { //set type of authenction here }
- 在
authenticate {}
块中包装您的电话
authenticate("auth") {
post(FORM) {
}
}
更多信息:Ktor Authentication
我想创建一个简单的表单,用户在其中输入一些字符串(授权他们上传文件的密钥)和他们要上传的文件(没有大小限制,甚至可以是 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>
- 添加身份验证功能
implementation "io.ktor:ktor-auth:$ktor_version"
- 安装功能
install(Authentication) { //set type of authenction here }
- 在
authenticate {}
块中包装您的电话
authenticate("auth") {
post(FORM) {
}
}
更多信息:Ktor Authentication