Swift 3 Alamofire carga de varias partes


Gracias a la migración a Swift 3, me resulta difícil compilar mi proyecto que utiliza Alamofire.

El problema ocurre al cargar multipartFormData:

Alamofire.upload(.POST, URL, headers: headers, multipartFormData: {
        multipartFormData in
.
.
. 
}) 

Referencia ambigua al miembro'upload(_:to:method:headers:)'

Cualquier ayuda muy apreciada, gracias de antemano!

RESUELTO:

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

    })

Así es como se debe implementar el método de carga en Swift 3

Author: DCDC, 2016-09-20

4 answers

Por ejemplo, usando Alamofire 4.0.0 en Swift 3:

(asegúrese de que está listo 4.0.0, ya que parece que no ha actualizado su Alamofire todavía)

Alamofire.upload(multipartFormData: { (multipartFormData) in
        // code
    }, to: URL, encodingCompletion: { (result) in
        // code
    })

O

Alamofire.upload(multipartFormData: { (multipartFormData) in
        // code
    }, with: URL, encodingCompletion: { (result) in
        // code
    })

Así que headers necesita ser pasado por URL request:

let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
 36
Author: pedrouan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-20 13:01:13

Pruebe este y la url establecida como @ pedrouan dijo.

Alamofire.upload(multipartFormData: { (multipartFormData) in
       multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg")
}, to: url) 
{ (result) in
      //result
}
 7
Author: Mitul Marsoniya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:52

En swift 3, tratando de establecer multipartFormData como @DCDC señaló en su solución. XCode intenta enviar a AnyObject antes .data (), así que en lugar de

value.data(using: String.Encoding.utf8)!, withName: key

Lo hice

[replace_your_var_name_here].data(using: String.Encoding.utf8)!, withName: key

En mi caso mi lista var no era grande, así que el hardcoding era una opción.

 1
Author: Jorge Manuel Bello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 17:29:25

Para Swift 3 y Alamofire ~4.3.0

Si alguien como yo intentó obtener el objeto de solicitud de forma sincrónica (sin usar bloqueos o dispatch_groups), puede usar este enfoque:

// 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

Tenga en cuenta que necesita establecer Content-Type encabezado de usted multipartFormData ya que contiene límites.

Si no necesita tener su objeto de solicitud sincrónicamente, la otra respuesta con

Alamofire.upload(multipartFormData: { (multipartFormData) in

Está funcionando como se esperaba. En caso de codificación exitosa de los datos, le devolverá el objeto de solicitud en cierre de devolución de llamada.

NOTA IMPORTANTE: si utilizas el método que he descrito, bloqueará tu subproceso (en la mayoría de los casos probablemente estés en el subproceso principal) para copiar y codificar tus datos. Así que no lo use para archivos grandes o lo que sea. Es asíncrona en Alamofire a propósito.

 0
Author: user1264176,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-14 17:07:02