Image Upload in Vapor 3 using PostgreSQL

后端 未结 3 1698
没有蜡笔的小新
没有蜡笔的小新 2021-01-04 11:16

I\'m following this guys Martin Lasek Tutorials and now i\'m at \"image upload\". It seems that no one has the answer to the question \"How do you upload images i Vapor 3\"

相关标签:
3条回答
  • 2021-01-04 11:24

    In order for req.content.decode(Question.self) to work, your model have to conforms to the Content protocol which is Vapor encapsulation of Codable + other encoding/decoding stuff.

    Did you add it to your Question model?

    something like that:

    extension Question: Content {}
    
    0 讨论(0)
  • 2021-01-04 11:31

    This uses automatic decoding of the multi-part form:

    router.get("upload") {
        request -> Future<View> in
        return try request.view().render("upload")
    }
    
    struct ExampleUpload: Content {
        let document: File
    }
    
    // this saves the file into a Question
    router.post(ExampleUpload.self, at:"upload") {
        request, upload -> Future<HTTPResponseStatus> in
        let question = try Question()
        question.imageData = upload.document.data
        question.imageName = upload.document.filename
        return question.save(on:request).transform(to: HTTPResponseStatus.ok)
    }
    

    The upload.leaf file is:

    <form method="POST" enctype="multipart/form-data">
    <input type="file" name="document" />
    <input type="submit" value="Send" />
    </form>
    

    Using the type File enables the local filename of the uploaded file to be accessed as well as the file data. If you add in the rest of the Question fields to the ExampleUpload structure, you can use the route to capture the whole form's fields.

    0 讨论(0)
  • 2021-01-04 11:45

    I've managed to get the image data by doing this:

    struct ImageRequest: Content {
        var imageData: Data
    }
    
    func analyizeImage(_ request: Request) throws -> Future<Response> {
        return try request.content.decode(ImageRequest.self).flatMap(to: Response.self, { [weak self] imageRequest in
            guard let image = NSImage(data: imageRequest.imageData) else {
                throw Abort(.badRequest)
            }
    
            // Do what you want with your image
        })
    }
    

    My form looked like this:

    <form method="POST" enctype="multipart/form-data">
        <input type="file" name="imageData" />
        <input type="submit" value="Send" />
    </form>
    
    0 讨论(0)
提交回复
热议问题