[kotlin] Ktor Location 라이브러리를 이용한 파일 업로드 및 다운로드

Kotlin에서 웹 애플리케이션을 개발할 때 파일 업로드와 다운로드 기능은 매우 중요합니다. Ktor Location 라이브러리를 사용하면 이러한 작업을 쉽게 수행할 수 있습니다.

이 라이브러리를 사용하여 파일 업로드 및 다운로드를 구현하는 방법에 대해 알아보겠습니다.

파일 업로드

먼저, 파일 업로드를 구현해 보겠습니다.

import io.ktor.locations.Location
import io.ktor.locations.locations
import io.ktor.locations.post
import io.ktor.routing.route

@Location("/upload")
class Upload

fun Route.upload() {
    post<Upload> {
        val multipart = call.receiveMultipart()
        var filename = ""

        multipart.forEachPart { part ->
            when (part) {
                is PartData.FormItem -> {
                    // form field
                }
                is PartData.FileItem -> {
                    val originalFileName = part.originalFileName!!
                    val file = File("uploads/${originalFileName}")
                    part.streamProvider().use { input ->
                        file.outputStream().buffered().use { output ->
                            input.copyTo(output)
                        }
                    }
                    filename = originalFileName
                }
            }
            part.dispose()
        }
        
        call.respondText("File $filename uploaded.")
    }
}

위의 코드는 /upload 경로에서 POST 요청을 처리하는 코드입니다. 요청으로 전송된 파일을 uploads 디렉터리에 저장하고, 업로드된 파일의 이름을 응답으로 반환합니다.

파일 다운로드

이어서, 파일 다운로드를 구현해 보겠습니다.

@Location("/download/{fileName}")
data class Download(val fileName: String)

fun Route.download() {
    get<Download> { params ->
        val fileName = params.fileName
        val file = File("uploads/$fileName")

        if (file.exists()) {
            val filePath = file.absoluteFile
            call.respondFile(filePath)
        } else {
            call.respondText("File not found.", status = HttpStatusCode.NotFound)
        }
    }
}

위의 코드는 /download/{fileName} 경로에서 GET 요청을 처리하는 코드입니다. 요청된 파일이 존재하는 경우 해당 파일을 응답으로 반환하고, 존재하지 않는 경우 “File not found.” 메시지를 반환합니다.

위의 예제를 통해 Ktor Location 라이브러리를 사용하여 파일 업로드와 다운로드를 쉽게 구현할 수 있음을 확인할 수 있습니다.