如何使用 Vapor 服务器端 swift 下载文件和发送文件?
How do I download a file and send a file using Vapor server side swift?
- 如何使用服务器端下载文件 swift?
我试过这个:
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
}
- 下载文件。
您在这里的方向是正确的,但是 result.body
始终为空的原因是因为您的文件服务 return 正在 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
目录中,然后让您的客户直接请求 public URL,或者 return 302
你自己指向它的回应。
如果您明确想要隐藏文件的永久位置或例如执行身份验证,然后您可以使用 Vapor 自己的 FileMiddleware 作为指南,从您自己的路径 return 文件。
文件也可以像这样在经过身份验证的路由上返回:
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)
}
- 如何使用服务器端下载文件 swift?
我试过这个:
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
}
- 下载文件。
您在这里的方向是正确的,但是 result.body
始终为空的原因是因为您的文件服务 return 正在 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
目录中,然后让您的客户直接请求 public URL,或者 return 302
你自己指向它的回应。
如果您明确想要隐藏文件的永久位置或例如执行身份验证,然后您可以使用 Vapor 自己的 FileMiddleware 作为指南,从您自己的路径 return 文件。
文件也可以像这样在经过身份验证的路由上返回:
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)
}