How do I save an image into a mongoDB collection using Kmongo?

794 Views Asked by At

I searched a lot today but all answers seem to be only in nodejs. I'm currently working on ktor application and I can't seem to find any way to upload images into MongoDB with KMongo.

1

There are 1 best solutions below

4
Aleksei Tirman On BEST ANSWER

You can use GridFS to store and retrieve binary files in MongoDB. Here is an example of storing an image, that is requested with the multipart/form-data method, in a test database:

import com.mongodb.client.gridfs.GridFSBuckets
import io.ktor.application.*
import io.ktor.http.*
import io.ktor.http.content.*
import io.ktor.request.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.litote.kmongo.KMongo

fun main() {
    val client = KMongo.createClient()
    val database = client.getDatabase("test")
    val bucket = GridFSBuckets.create(database, "fs_file")

    embeddedServer(Netty, port = 8080) {
        routing {
            post("/image") {
                val multipartData = call.receiveMultipart()

                multipartData.forEachPart { part ->
                    if (part is PartData.FileItem) {
                        val fileName = part.originalFileName as String
                        withContext(Dispatchers.IO) {
                            bucket.uploadFromStream(fileName, part.streamProvider())
                        }

                        call.respond(HttpStatusCode.OK)
                    }
                }
            }
        }
    }.start()
}

To make a request run the following curl command: curl -v -F image.jpg=@/path/to/image.jpg http://localhost:8080/image

To inspect stored files run db.fs_file.files.find() in the mongo shell.