【问题标题】:How to respond with an image using Vapor?如何使用 Vapor 响应图像?
【发布时间】:2018-08-22 21:26:53
【问题描述】:

我只想有一个控制器操作,它与直接通过Public/ 文件夹访问图像基本相同。不同之处在于路线可以是您想要的任何路线,并且返回的图像将是在控制器函数内部确定的图像。但是如何创建正确的响应呢?

我的方法是这样的:

import Vapor

final class ImageController {
    func read(_ req: Request) throws -> Future<Data> {
        let directory = DirectoryConfig.detect()
        let promise = req.eventLoop.newPromise(Data.self)
        req.eventLoop.execute {
            do {
                let data = try Data(contentsOf: URL(fileURLWithPath: directory.workDir)
                    .appendingPathComponent("Public", isDirectory: true)
                    .appendingPathComponent("image.png"))
                promise.succeed(result: data)
            } catch {
                promise.fail(error: error)
            }
        }
        return promise.futureResult
//        try req.content.encode(data, as: .png)
    }
}

但在我看来,我过于复杂了,是吗?

【问题讨论】:

    标签: swift vapor


    【解决方案1】:

    但是如何创建适当的响应呢?

    直接创建一个Response并设置MediaTyperequest.makeResponse(data, as: MediaType.png)

    例子:

    struct ImageController: RouteCollection {
        func boot(router: Router) throws {
            let imageRoutes = router.grouped("images")
            // GET /images/get-test-image
            imageRoutes.get("get-test-image", use: getTestImage)    
        }
    
        func getTestImage(_ request: Request) throws -> Response {
            // add controller code here 
            // to determine which image is returned
            let filePath = "/path/to/image18.png"
            let fileUrl = URL(fileURLWithPath: filePath)
    
            do {
                let data = try Data(contentsOf: fileUrl)
                // makeResponse(body: LosslessHTTPBodyRepresentable, as: MediaType)
                let response: Response = request.makeResponse(data, as: MediaType.png)
                return response
            } catch {
                let response: Response = request.makeResponse("image not available")
                return response
            }
        }
    }
    

    【讨论】:

    • 你知道如何在 Vapor 4 中做同样的事情吗?
    【解决方案2】:

    另外两种方法:

    1. 使用 Leaf 部署镜像的路由:

      route.get("/my/random/route") {
           request -> Future<View> in
           return try request.view().render("image", ["imgname":"image.png"])
      }
      

    使用 image.leaf 包含:

    <img src="#(imgname)">
    
    1. 重定向到Public中的原始位置:

      route.get("/my/random/route") {
          request -> Response in
          return request.redirect(to: "/image.png")
      }
      

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多