如何在 Ktor 中授权 POST 表单上传?
Posted
技术标签:
【中文标题】如何在 Ktor 中授权 POST 表单上传?【英文标题】:How to authorize POST form upload in Ktor? 【发布时间】:2020-07-18 11:31:42 【问题描述】:我想创建一个简单的表单,用户可以在其中输入一些字符串(授权他们上传文件的密钥)和他们想要上传的文件(没有大小限制,甚至可以是 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>
【问题讨论】:
您应该在 HTTP 标头而不是正文中传递授权数据 @NikolaiShevchenko 通常我会使用 curl 并将?key=mykey
附加到 URL,但我不知道是否可以使用 html 表单发送一半 POST 一半 GET 请求(从搜索结果判断谷歌这是不可能的)。
【参考方案1】:
-
添加身份验证功能
implementation "io.ktor:ktor-auth:$ktor_version"
-
安装功能
install(Authentication) //set type of authenction here
-
将您的电话封装在
authenticate
块中
authenticate("auth")
post(FORM)
更多信息:Ktor Authentication
【讨论】:
以上是关于如何在 Ktor 中授权 POST 表单上传?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ktor kotlin 通过 POST 发送 JSON 字符串?