interface FileApi { @Multipart @POST("/upload0") fun upload0(@Part("title") title: RequestBody, @Part file: MultipartBody.Part): Call ... } fun upload0() { val title = "my file" val titlePart = RequestBody.create(MultipartBody.FORM, title) val file = File(uploadDir, "horse.ogg") val filebody = RequestBody.create(MediaType.parse("multipart/form-data"), file) val filepart = MultipartBody.Part.createFormData("file", file.name, filebody) val call = fileApi.upload0(titlePart, filepart) val response = call.execute().body() } server side : @location("/upload0") class Upload0 val multipart = call.request.receive() if (call.request.isMultipart()) { multipart.parts.forEach { part -> if (part is PartData.FormItem) { if (part.partName == "title") { title = part.value } } else if (part is PartData.FileItem) { val ext = File(part.originalFileName).extension val file = File(uploadDir, "${System.currentTimeMillis()}.$ext") part.streamProvider().use { instream -> file.outputStream().buffered().use { outstream -> instream.copyTo(outstream) } } fileName = file.name fileType = part.contentType?.contentType } part.dispose() } }