Swift 3 Alamofire multipart subir

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

El problema se produce cuando la carga de multipartFormData:

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

Referencia ambigua a los estados ‘subir(_:a:método:encabezados:)’

Cualquier ayuda que se agradece mucho, 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)
            }

    })

Esto es cómo el método de carga debe ser implementado en Swift 3

  • Las firmas de los métodos han cambiado. Comentario de los ya existentes y vamos a Xcode del autocompletar guía para la escritura de los nuevos.
  • y también se puede ir a alamofire en gitub. github.com/Alamofire/Alamofire
InformationsquelleAutor DCDC | 2016-09-20

4 Kommentare

  1. 36

    Por ejemplo, el uso de Alamofire 4.0.0 en Swift 3:

    (asegúrese de que la 4.0.0 listo como parece que usted no ha actualizado su Alamofire aún)

    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í headers se deben pasar por solicitud de dirección URL:

    let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
    • una pregunta más, ¿qué código debe ir en primer marcador de posición(multipartFormData) y lo que debe ir en el último (resultado)? Anteriormente sólo había un cierre
    • No es obligatorio rellenar con el código, los cierres son para usted el uso eventual. Pero supongo que, a la finalización cierres son útiles como llegar sus comentarios ya que es el método asincrónico.
    • Permítanos continuar esta discusión en el chat.
    • Parece que su Alamofire no se ha actualizado a la 4.0.0
    • Así es, de lo contrario sería nit mostrar el primer mensaje de error supongo
    • Sí -y, si quieres migrar a Swift 3.0, la actualización de Alamofire a 4 versión es una necesidad. Ahora supongo que se podría obtener que por ti mismo, si es de 4. De todos modos, si necesitas algún tipo de ayuda y/o crear otra pregunta en cualquier momento, comentario y me voy a ver.
    • Ok, no devuelve ningún error ahora, el problema era con mi método de aplicación, ver a mis editado pregunta. Gracias!
    • Esto no funciona para mí….. a alguien más? No sabe qué otra cosa hacer.
    • cómo sobre el archivo de audio? – yo trato de enviar un archivo de audio en esta forma : multipartFormData.append(audioLocalPath, aname: «archivo», nombre de archivo: «archivo», mimeType: «application/octet-stream»), pero a ocurrir este error : multipartEncodingFailed(Alamofire.AFError.MultipartEncodingFailureReason.bodyPartFileNotReachableWithError(file:///var/mobile/Containers/……. /Documentos/elemento.mp3, NSUnderlyingError=0x16049100 {Error de Dominio=NSPOSIXErrorDomain Código=2 «No existe el fichero o directorio»}})) – ¿dónde está el problema? -solicitud incorrecta o mal de una ruta de audio?
    • Gracias hombre . Estaba buscando esto desde el pasado 5 horas. y hubo muchas solución disponible, pero este trabajo sólo
    • el uso de la urlRequest da error <«Tipo de expresión es ambigua, sin más contenido» >, pero funciona si se utiliza solo la url. Lo que me estoy perdiendo??

  2. 7

    Probar este y del conjunto de url como @pedrouan dijo.

    Alamofire.upload(multipartFormData: { (multipartFormData) in
           multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg")
    }, to: url) 
    { (result) in
          //result
    }
  3. 1

    En swift 3, tratando de establecer multipartFormData como @DC señaló en su solución. XCode tratar de arrojar a AnyObject antes .de datos(), así que en lugar de

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

    Hice

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

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

  4. 1

    Para Swift 3 y Alamofire ~4.3.0

    Si alguien como yo traté de conseguir objeto de solicitud de forma sincrónica (sin el uso de bloqueos o dispatch_groups) también puede utilizar este método:

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

    Por favor, tenga en cuenta que usted necesita para establecer Content-Type encabezado de usted multipartFormData ya que contiene límites.

    Si usted no necesita tener en su objeto de solicitud de forma sincrónica la otra respuesta con

    Alamofire.upload(multipartFormData: { (multipartFormData) in

    está funcionando como se esperaba. En caso de éxito de la codificación de los datos se volverá objeto de solicitud de devolución de llamada de cierre.

    NOTA IMPORTANTE: si utiliza el método que he descrito, va a bloquear el hilo (en la mayoría de los casos probablemente usted está en el hilo Principal) para copiar y codificar sus datos. Así que no lo use para archivos de gran tamaño o lo que sea. Es asíncrono en Alamofire a propósito.

    • Donde se sessionManager suena?
    • es una instancia de Alamofire.SessionManager utiliza para hacer una solicitud. En mi código de producción que se crea una vez cuando la aplicación está inicializado y se utiliza en toda la aplicación. En este fragmento de la respuesta no puede ser creado en el código marcado como ‘…’ después de //externa de la función. Aunque de nuevo, no es relevante donde ha creado su sesión de administrador para este fragmento de código.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea