Как загрузить файл и отправить его с помощью Swift на стороне сервера Vapor?

  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
}

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 ответ вашего собственного указания на это.

Если вы явно хотите скрыть постоянное место хранения файла или, например, выполнить аутентификацию, вы можете вернуть файл по собственному маршруту, используя собственный FileMiddleware от Vapor в качестве руководства.

Файл также может быть возвращен по аутентифицированному маршруту следующим образом:

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)
}
Другие вопросы по тегам