Я хочу создать простую форму, в которой пользователь вводит некоторую строку (ключ, который разрешает ему загрузить файл) и файл, который он хочет загрузить (без ограничения размера, может быть даже 10 ГБ или более).
У меня проблема в том, что я не знаю, как проверить код ДО принятия файла.
Пока у меня есть этот код, который запрещает любую загрузку даже с действительным кодом, так как загруженный файл, кажется, всегда первый элемент формы для проверки. (когда я изменил порядок элементов в форме, этот код вообще не обрабатывал запрос)
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>