【问题标题】:How do I download a file and send a file using Vapor server side swift?如何使用 Vapor 服务器端 swift 下载文件并发送文件?
【发布时间】:2017-06-14 13:00:03
【问题描述】:
  1. 如何使用服务器端 swift 下载文件?

我试过这个:

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

但 result.body 总是 = 0 个元素

  1. 如何发送文件?

我试过了

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

【问题讨论】:

标签: swift vapor server-side-swift


【解决方案1】:
  1. 下载文件。

您在这里是正确的,但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. 发送文件。

最好的方法是将您的文件保存在您的 Vapor 应用程序的 Public 目录中,让您的客户端直接请求公共 URL,或者返回您自己指向它的 302 响应。

如果您明确想要隐藏文件的永久主页,例如执行身份验证,然后您可以使用 Vapor 自己的 FileMiddleware 作为指南从自己的路线返回文件。

【讨论】:

    【解决方案2】:

    文件也可以像这样在经过身份验证的路由上返回:

    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)
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-08
      • 2015-02-16
      • 2015-06-27
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2023-02-03
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多