46 votes

Swift 3 Alamofire upload en plusieurs parties

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

36voto

pedrouan Points 256

Par exemple, en utilisant Alamofire 4.0.0 dans Swift 3 :

(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 URL:

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

7voto

mitul marsonia Points 196

Essayez celui-ci et définissez l'url comme @ pedrouan .

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

1voto

Dans swift 3, essayez de définir multipartFormData comme indiqué par @DCDC dans sa solution. XCode essaie de transtyper 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.

1voto

user1264176 Points 666

Pour Swift 3 et Alamofire ~4.3.0

Si quelqu'un comme moi essayé d'obtenir l'objet de demande de manière synchrone (sans l'aide de verrous ou dispatch_groups) vous pouvez utiliser cette méthode:

// 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 - tête de vous multipartFormData car il contient des frontières.

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 de l'encodage de données, il vous renvoie l'objet de demande de rappel de fermeture.

REMARQUE IMPORTANTE: si vous utilisez la méthode que j'ai décrite, il permet de bloquer votre thread (dans la plupart des cas, vous n'êtes probablement dans le thread Principal) à copier et à l'encodage de vos données. Afin de ne pas l'utiliser pour de gros fichiers, ou quoi que ce soit. Il est asynchrone dans Alamofire sur le but.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X