如何使用蒸气响应图像?

Mar*_*arc 3 swift vapor

我只想拥有一个控制器操作,该操作基本上与直接通过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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

l -*_*c l 6

但是,如何做出适当的回应?

直接创建一个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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你知道如何在 Vapor 4 中做同样的事情吗? (3认同)

Nic*_*ick 5

另外两种方法:

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

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

image.leaf 包含:

<img src="#(imgname)">
Run Code Online (Sandbox Code Playgroud)
  1. 重定向到原始位置Public

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