我试过这个:
let result = try drop.client.get("http://dropcanvas.com/ir4ok/1")
但是result.body总是= 0个元素
我试过这个
drop.get("theFile") { request in
let file = NSData(contentsOf: "/Users/bob.zip")
return file // This fails here
}
答案 0 :(得分:2)
您在这里是正确的轨道,但result.body
始终为空的原因是因为您的文件服务正在返回302
重定向而不是文件本身。您需要遵循此重定向。这是一个简单的实现,仅针对您的用例,有效:
var url: String = "http://dropcanvas.com/ir4ok/1"
var result: Response!
while true {
result = try drop.client.get(url)
guard result.status == .found else { break }
url = result.headers["Location"]!
}
let body = result.body
最好的方法是将您的文件保存在Vapor应用的Public
目录中,让客户直接请求公开网址,或者返回您自己的302
响应指着它。
如果您明确希望隐藏文件的永久主页,或者例如执行身份验证然后您可以使用Vapor自己的FileMiddleware作为指南从您自己的路线返回文件。
答案 1 :(得分:1)
文件也可以通过经过验证的路由返回,如下所示:
let fileId: String = "abcd123"
func getFile(on req: Request) throws -> Future<Response> {
let directory = try req.make(DirectoryConfig.self)
let path = directory.workDir + Constants.filesPath + fileId + ".pdf"
return try req.streamFile(at: path)
}