web-dev-qa-db-fra.com

Swift 3 téléchargement multipart Alamofire

Grâce à la migration vers Swift 3, je trouve difficile de compiler mon projet utilisant Alamofire.

Le problème se produit lors du téléchargement de multipartFormData:

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

Référence ambiguë au membre 'upload (_: to: method: headers :)'

Toute aide très appréciée, merci d'avance!

RÉSOLU:

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

    })

C’est ainsi que la méthode de téléchargement devrait être mise en œuvre dans Swift 3

45
DCDC

Par exemple, en utilisant Alamofire 4.0.0 dans Swift:

(assurez-vous que vous êtes prêt pour la version 4.0.0 car il semble que vous n'ayez pas encore mis à jour votre Alamofire)

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

ou

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

Donc, headers doit être passé par une requête d'URL:

let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
36
pedrouan

Essayez celui-ci et définissez l'URL comme @ pedrouan , dit.

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

Pour Swift 3 et Alamofire ~ 4.3.0

Si quelqu'un comme moi essayait d'obtenir l'objet requête de manière synchrone (sans utiliser de verrous ni de dispatch_groups), vous pouvez utiliser cette approche:

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

Veuillez noter que vous devez définir Content-Type _ en-tête de votre part multipartFormData car il contient des limites.

Si vous n'avez pas besoin d'avoir votre demande objet de manière synchrone, l'autre réponse avec

Alamofire.upload(multipartFormData: { (multipartFormData) in

fonctionne comme prévu. En cas de succès du codage des données, l'objet de demande sera renvoyé lors de la fermeture du rappel.

NOTE IMPORTANTE: Si vous utilisez la méthode que j'ai décrite, votre thread sera bloqué (dans la plupart des cas, vous êtes probablement dans le thread principal) pour copier et encoder vos données. Donc, ne l'utilisez pas pour les gros fichiers ou quoi que ce soit. C'est exprès dans Alamofire.

1
user1264176

Dans Swift 3, essayez de définir multipartFormData comme l'a indiqué @DCDC dans sa solution. XCode tente de convertir en un objet AnyObject avant .data (), donc au lieu de

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

J'ai fait

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

Dans mon cas, ma liste var n'était pas très grosse, donc le codage en dur était une option.

1