如何使用Vapor服务器端swift下载文件并发送文件?

时间:2017-01-29 05:06:53

标签: swift vapor server-side-swift

  1. 如何使用服务器端swift下载文件?
  2. 我试过这个:

    let result = try drop.client.get("http://dropcanvas.com/ir4ok/1")
    

    但是result.body总是= 0个元素

    1. 如何发送文件?
    2. 我试过这个

      drop.get("theFile") { request in 
         let file = NSData(contentsOf: "/Users/bob.zip")
         return file // This fails here
      }
      

2 个答案:

答案 0 :(得分:2)

  1. 下载文件。
  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
    
    1. 发送文件。
    2. 最好的方法是将您的文件保存在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)
}