gpt4 book ai didi

swift - 在 Vapor 中使用临时文件响应请求的正确方法

转载 作者:行者123 更新时间:2023-12-04 17:23:29 25 4
gpt4 key购买 nike

我有一个 Vapor 服务器在运行,它正在创建文件。这些文件是临时文件,因此不应保留在服务器上。

目前我使用的是:

let data = try Data(contentsOf: tempURL)
try FileManager.default.removeItem(at: tempURL)
let response = Response(status: .ok, headers: HTTPHeaders(headers), body: Response.Body(data: data))

所以我读取了文件的内容,删除了那个文件(因为它只是临时的)然后用它来响应。

我现在看到的问题是,有时很难重现该文件的内容,只提交了部分内容。我还不知道到底是什么问题,但我做了一些挖掘,至少找到了一个 Radar ( https://openradar.appspot.com/39621032 ),说这个功能在 Linux 上运行不正常(我使用 .. 我使用它在 Docker 容器中)

所以为了确保这不是问题所在,我想知道 Vapor 响应文件然后删除它的方式?!?

最佳答案

如果这个问题仍然存在,我想提出我的解决方案。我的系统是 Vapor 4.49.0、Swift 5.5、macOS 11.6(应该适用于 Ubuntu 20.04)。我将在这里发布小而完整的文件 routes.swift,请看:

//
// routes.swift
//
//
// Created by Alex on 09.10.2021.
//

import Vapor

func routes(_ app: Application) throws {

app.get(":fileName") { req -> EventLoopFuture<Response> in
let badResponse = Response(status: .forbidden, version: .http1_0, headers: HTTPHeaders(), body: .empty)

guard let fileName = req.parameters.get("fileName") else {
return req.eventLoop.future(badResponse)
}

let filePath = app.directory.workingDirectory + fileName

guard let file = File(filePath: filePath) else {
return req.eventLoop.future(badResponse)
}

return req.fileio.collectFile(at: filePath).map { biteBuffer in
let body = Response.Body(buffer: biteBuffer)

let response = Response(status: .ok, headers: HTTPHeaders(), body: body)

file.delete()

return response
}
}

}

final class File {

private let fileManager = FileManager.default
private let url: URL

init?(filePath: String) {
guard let url = URL(string: "file:" + filePath) else {
return nil
}

self.url = url
}

func delete() {
do {
try fileManager.removeItem(at: url)
} catch {
}
}

}

我想听听你的回答。如果你能测试这段代码,我会很高兴。谢谢。

关于swift - 在 Vapor 中使用临时文件响应请求的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64909274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com