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 44

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 специально.