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
4 Réponses :
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) } }
ça ne marche pas non plus :( Le type d'expression '()' est ambigu sans plus de contexte
{ 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() } } }
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) }
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)
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) } }