如何在 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 中接收 POST 数组参数?

如何在 Python 中模拟 post 表单来上传文件

如何使用 ktor kotlin 通过 POST 发送 JSON 字符串?

如何使用 ktor 上传单个位图图像?

如何使用 Ktor 服务器向其他服务器发送 POST 请求?

如何使用 http.post 上传文件和表单数据