Swift 3 Alamofire multipart upload
Благодаря миграции на Swift 3 Мне трудно скомпилировать свой проект, который использует Alamofire.
Проблема возникает при загрузке multipartFormData:
Alamofire.upload(.POST, URL, headers: headers, multipartFormData: {
multipartFormData in
.
.
.
})
Неоднозначная ссылка на элемент 'upload (_: to: method: headers:)'
Любая помощь очень ценится, заранее спасибо!
Решено:
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(fileData, withName: "file_pack", fileName: "file_pack", mimeType: "text/plain")
for (key, value) in self.parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
}, with: URL2, encodingCompletion: { (result) in
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
self.delegate?.showSuccessAlert()
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
// self.showSuccesAlert()
self.removeImage("frame", fileExtension: "txt")
if let JSON = response.result.value {
print("JSON: (JSON)")
}
}
case .failure(let encodingError):
self.delegate?.showFailAlert()
print(encodingError)
}
})
Именно так должен быть реализован метод upload в Swift 3
4 ответа:
Например, используя Аламофир 4.0.0 in Swift 3:
(Убедитесь, что вы готовы к 4.0.0, так как похоже, что вы еще не обновили свой Alamofire)
Alamofire.upload(multipartFormData: { (multipartFormData) in // code }, to: URL, encodingCompletion: { (result) in // code })
Или
Alamofire.upload(multipartFormData: { (multipartFormData) in // code }, with: URL, encodingCompletion: { (result) in // code })
Так что
headers
нужно передать по URL-запросу:let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
Попробуйте это и url-адрес, установленный как @ pedrouan сказал.
Alamofire.upload(multipartFormData: { (multipartFormData) in multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg") }, to: url) { (result) in //result }
В swift 3, пытаясь установить multipartFormData, как указал @DCDC в своем решении. В Xcode пытаются бросить на какой-либо объект раньше .data (), поэтому вместо
value.data(using: String.Encoding.utf8)!, withName: key
Я сделал
[replace_your_var_name_here].data(using: String.Encoding.utf8)!, withName: key
В моем случае мой список var не был большим, поэтому жесткое кодирование было вариантом.
Для Swift 3 и Alamofire ~4.3.0
Если кто-то вроде меня пытался получить объект запроса синхронно (без использования блокировок или dispatch_groups), вы можете использовать такой подход:
Обратите внимание, что вам нужно установить Заголовок// outer function ... let string = "string to send" let multipartFormData = MultipartFormData() multipartFormData.append(string.data(using: .utf8)!, withName: "str") guard let data = try? multipartFormData.encode() else { // fail appropriately } let request = sessionManager.upload(data, to: url, method: .post, /* this is VERY IMPORTANT LINE */ headers: ["Content-Type" : multipartFormData.contentType]) request.validate() // do whatever you need with request
Content-Type
от васmultipartFormData
, так как он содержит границы.Если вам не нужно, чтобы ваш запрос был синхронным, другой ответ с
Alamofire.upload(multipartFormData: { (multipartFormData) in
Работает, как и ожидалось. В случае успешного кодирования данных он вернет вам запрашиваемый объект в закрытие обратного звонка.
Важное примечание: Если вы используете метод, который я описал, он заблокирует ваш поток (в большинстве случаев вы, вероятно, находитесь в основном потоке) для копирования и кодирования ваших данных. Так что не используйте его для больших файлов или чего-то еще. Это асинхронно в Alamofire специально.