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)
}
}
但在我看来,我过于复杂了,是吗?
解决方案
但是如何创建适当的响应呢?
直接创建一个Response
并设置MediaType
:request.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
}
}
}
推荐阅读
- c# - 如何在运行时将文本文件从 Unity Asset 文件夹移动到 Android persistentDataPath?
- swift - 如何使用 SwiftUI 中的组合从缓存中删除图像?
- python-3.x - 如果互联网死机且没有更新,我如何获得天气显示以使用以前的数据?
- html - 如何正确使用 google.script.run?
- asp.net-core - ASP.NET Core 本地化 Razor 页面中的 .cs 文件
- vb.net - 在 Microsoft Visual Studio 中添加 CommandBar 时出错
- eclipse - 是否有用于删除/选择字段的 CDS 视图注释 (ABAP)?
- python - 如何在 Dash Dropdown 中修复 multi=True 的高度?
- tibco - 是否可以在两个客户端上接收相同的消息?
- api - 检查 Microsoft Store 中大量应用程序的可用性