Как загрузить файл и отправить его с помощью Swift на стороне сервера Vapor?
- Как загрузить файл, используя серверную часть 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
}
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
- Отправить файл
Самый лучший способ - сохранить файл в приложении 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)
}