【问题标题】:Image Upload in Vapor 3 using PostgreSQL使用 PostgreSQL 在 Vapor 3 中上传图像
【发布时间】:2018-12-30 17:50:53
【问题描述】:

我正在关注这些人Martin Lasek 教程,现在我在“图片上传”。 似乎没有人能回答“你如何在 Vapor 3 中上传图片”这个问题

数据库连接正常,其他值全部保存。

这是我的创建方法:

    func create(_ req: Request) throws -> Future<Response> {

    return try req.content.decode(Question.self).flatMap { question in
        return question.save(on: req).map { _ in

            return req.redirect(to: "/form")
        }
    }
}

和型号:

final class Question: PostgreSQLModel {

var id: Int?
var questionText: String
var answers: [String]
var theme: String?
var imageName: String?
var imageData: File?

init(id: Int? = nil, questionText: String, answers: [String], theme: String, imageName: String?, imageData: File?) {

    self.id = id
    self.questionText = questionText
    self.answers = answers
    self.theme = theme
    self.imageName = imageName
    self.imageData = imageData
}

}

和叶子模板:

<form action="/save" method="POST" enctype="multipart/form-data" id="upload-form">
<input type="file" accept="image/png,image/jpg" name="image">
<input class="btn btn-success btn-block" type="submit" value="Legg til">
</form>

我知道需要一种管理文件的方法和原始图像字节,

但是我怎么去那里?

【问题讨论】:

    标签: swift multipartform-data vapor leaf


    【解决方案1】:

    这使用了多部分形式的自动解码:

    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)
    }
    

    upload.leaf 文件是:

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

    使用File 类型可以访问上传文件的本地文件名以及文件数据。如果将其余的 Question 字段添加到 ExampleUpload 结构中,则可以使用该路由来捕获整个表单的字段。

    【讨论】:

      【解决方案2】:

      为了使req.content.decode(Question.self) 工作,您的模型必须符合Content 协议,该协议是Codable + 其他编码/解码内容的蒸汽封装。

      您是否将其添加到您的 Question 模型中?

      类似的东西:

      extension Question: Content {}
      

      【讨论】:

      • 对不起@Billa 但我不明白。这里需要格式化什么?
      【解决方案3】:

      我已经设法通过这样做来获取图像数据:

      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
          })
      }
      

      我的表单如下所示:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 2016-10-01
        • 2017-03-22
        • 2012-07-03
        • 2020-06-05
        • 1970-01-01
        相关资源
        最近更新 更多