Swift 如何使用Vapor对图像进行响应?

Swift 如何使用Vapor对图像进行响应?,swift,vapor,Swift,Vapor,我只想有一个控制器操作,基本上与通过Public/文件夹直接访问图像的操作相同。不同之处在于,路由可以是任何您想要的,并且返回的图像将是控制器函数内部确定的图像。但如何做出正确的反应呢 我的方法如下: import Vapor final class ImageController { func read(_ req: Request) throws -> Future<Data> { let directory = DirectoryConfig.d

我只想有一个控制器操作,基本上与通过
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)
    }
}
导入蒸汽
最终类图像控制器{
func read(请求)抛出->未来{
let directory=DirectoryConfig.detect()
让promise=req.eventLoop.newPromise(Data.self)
req.eventLoop.execute{
做{
let data=try data(contentsOf:URL(fileURLWithPath:directory.workDir)
.appendingPathComponent(“Public”,isDirectory:true)
.appendingPathComponent(“image.png”))
承诺。成功(结果:数据)
}抓住{
承诺失败(错误:错误)
}
}
回报承诺。未来的结果
//try req.content.encode(数据格式为:.png)
}
}

但在我看来,我把它复杂化了,是吗?

另外两种方法:

  • 使用Leaf部署映像的路由:

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

  • 但是如何创建正确的响应?

    直接创建一个
    响应
    并设置
    媒体类型
    请求.makeResponse(数据,如: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
            }
        }
    }
    

    你知道如何在蒸汽4中制造同样的东西吗?
    route.get("/my/random/route") {
        request -> Response in
        return request.redirect(to: "/image.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
            }
        }
    }