1
votes

Comment télécharger des photos avec Alamofire (post)?

Je dois faire une demande API pour télécharger une image qui a été prise par la caméra ou sélectionnée dans la galerie. La méthode définie dans l'API est définie et dans le corps / les paramètres, il n'y a que

responseSerializationFailed(reason: Alamofire.AFError
.ResponseSerializationFailureReason.inputDataNilOrZeroLength)

où la valeur est l'image elle-même. (dans postman, je viens de télécharger une image de mes fichiers et cela fonctionne) et il renvoie une URL avec d'autres informations. Le problème est que je ne peux pas obtenir la demande pour avoir une réponse réussie, et je ne sais pas comment je peux transmettre l'UIImage à Alamofire. C'est ce que j'ai fait

Alamofire.request(baseUrl,
          method: .post,
          parameters: ["file" : expenseImage])
.responseJSON(completionHandler: { response in
                            guard response.result.error == nil else {
                                print("Error subiendo la imagen \n\(response.result.error!)")
                                return
                            }

                            guard let json = response.result.value as? [String: Any] else {
                                if let error = response.result.error {
                                    print("Error: \(error.localizedDescription)")
                                }
                                return
                            }
                            do {
                                let decoder = JSONDecoder()
                                let rawData = try JSONSerialization.data(withJSONObject: json, options: [])
                                let dataObject = try decoder.decode(PutObjectFile.self, from: rawData)
                                finished(dataObject)
                                print(dataObject)

                                print(dataObject.msg.file_info.url)
                            } catch let error {
                                print("Error decoding:\n\(error)")
                            }
                          })

et l'erreur que j'obtiens dans la console est la suivante:

key:file
value: // 

J'ai essayé d'utiliser une URL d'image aléatoire mais cela ne fonctionne pas non plus


0 commentaires

4 Réponses :


0
votes

Utilisez la méthode de téléchargement d'Alamofire pour télécharger votre image dans multipartFormData . j'ai mis à jour le code pour vous. utilisez le code ci-dessous.

Alamofire.upload(multipartFormData: { multipartFormData in
        multipartFormData.append(expenseImage, withName: "file",fileName: "file.jpg", mimeType: "image/jpg")
        },
with: baseUrl)
{ (result) in
    switch result {
    case .success(let upload, _, _):

        upload.uploadProgress(closure: { (progress) in
            print("Upload Progress: \(progress.fractionCompleted)")
        })

        upload.responseJSON { response in
             print(response.result.value)  
        }

    case .failure(let encodingError):
        print(encodingError)  
    }
}


1 commentaires

ça ne marche pas non plus :( Le type d'expression '()' est ambigu sans plus de contexte



0
votes
 {
        let id : String = UserDefaults.standard.string(forKey: "id")!
        print(id)

        self.view.makeToastActivity(.center)

        Alamofire.upload(multipartFormData: { (multipartFormData) in
            multipartFormData.append(UIImageJPEGRepresentation(self.imageView.image!, 0.5)!, withName: "profile_pic", fileName: "swift_file.jpeg", mimeType: "image/jpeg")
            for (key, value) in [“key”: "", ] {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
            }
        }, to:BaseURL + “base_url”)
        { (result) in
            switch result {
            case .success(let upload, _, _):

                upload.uploadProgress(closure: { (Progress) in
                    print("Upload Progress: \(Progress.fractionCompleted)")
                })

                upload.responseJSON { response in

                    if let JSON = response.result.value as? NSDictionary
                    {
                        print("JSON: \(JSON)")

                        let data = JSON["data"] as? NSArray


                        let status = JSON["status"] as? Int

                        if(status == 201)
                        {


                        }
                    }

                    self.view.hideToastActivity()
                }

            case .failure(let encodingError):
                //self.delegate?.showFailAlert()
                print(encodingError)
                self.view.hideToastActivity()
            }

        }
    }

0 commentaires

0
votes

Vous pouvez télécharger des images en utilisant des données en plusieurs parties, utilisez le code ci-dessous:

let manager = Alamofire.SessionManager.default
    do{
        manager.upload(multipartFormData: { (formData) in
            if let fileData = fileData { // File data
                formData.append(fileData, withName: "FILE_NAME", fileName: "simple.jpeg", mimeType: "image/jpeg")
            }
        }, to: "API_PATH", method: HTTPMethod.post, headers: nil, encodingCompletion: { encoding in
            switch encoding{
            case .success(let req, _, _):
                req.uploadProgress(closure: { (prog) in
                    progress?(prog)
                }).responseJSON { (resObj) in
                    switch resObj.result{
                    case .success:
                        if let resData = resObj.data{
                            do {
                                let res = try JSONSerialization.jsonObject(with: resData)
                                print(res) // Success
                            } catch let err{
                                print(err)
                            }
                        }
                        break
                    case .failure(let err):
                        print(err)
                        break
                    }
                }
                break
            case .failure(let err):
                print(err)
                break
            }
        })
    }catch let err{
        print(err)
    }


3 commentaires

J'obtiens cette erreur Impossible d'appeler 'append' avec une liste d'arguments de type '((CGFloat) -> Data ?, withName: String, fileName: String, mimeType: String)'


Vous devez convertir UIImage en données pour l'ajouter dans formData. Avez-vous fait cela?


Maintenant je l'ai fait et j'obtiens à nouveau cette erreur responseSerializationFailed (raison: Alamofire.AFError.ResponseSerializationFailureReason.inputDa‌ taNilOrZeroLength)



1
votes

J'ai eu le même problème, je l'ai résolu en faisant ceci: Alamofire 5.0.0-beta.5

AF.upload(multipartFormData: { multipartFormData in
        multipartFormData.append(imgData, withName: "file",fileName: "file.jpg", mimeType: "image/jpg")
            },
        to: url).responseJSON
        { response in print(response)
            if let status = response.response?.statusCode {
                                print(status)
                            }
            //to get JSON return value
            if let result = response.value {
                let res = result as! [String: String]
                let newUrl:String = res["url"]!
                            print(newUrl)
            }
        }


0 commentaires