2017-09-06 2 views
1

J'utilise Alamofire pour télécharger des images, mais le téléchargement échoue.
J'apporte également les paramètres & au serveur.
Je ne sais pas si j'ajoute le jeton & paramètres correctement ou non.
Qu'est-ce qui ne va pas avec moi pour utiliser Alamofire?
Pour toute suggestion? Merci.
Comment télécharger une image avec Alamofire avec token & parameters?

func uploadWithAlamofire(image:UIImage, imageData:Data, imageUrl:URL) {   
    let parameters = ["avatar":imageData] 

    Alamofire.upload(multipartFormData: { multipartFormData in 
     multipartFormData.append(imageData, withName: user.id, fileName: "\(user.id).jpg", mimeType: "image/jpg") 

     for (key, value) in parameters { 
      multipartFormData.append(value, withName: key) 
     } 
    }, to: apiUrl , method: .put, headers: ["Authorization": "Bearer \(token)"], 
      encodingCompletion: { encodingResult in 
       switch encodingResult { 
       case .success(let upload, _, _): 
        upload.response { [weak self] response in 
         guard self != nil else { 
          return 
         } 
         debugPrint(response) 
        } 
       case .failure(let encodingError): 
        print("error:\(encodingError)") 
       } 
    }) 
} 


func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    photoImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
    photoImageView.image = photoImage 

    let imageName:String = user.id + ".jpg" 
    let documentsPath = NSHomeDirectory().appending("/Documents/Icon/") 
    let imagePath = documentsPath.appending(imageName) 
    let imageUrl = URL(fileURLWithPath: imagePath) 
    print("imageUrl is here:\(imageUrl)") 

    let imageData:Data = UIImageJPEGRepresentation(photoImage, 0.001)! 

    do { 
     try imageData.write(to: imageUrl,options: .atomic) 
    } catch let error { 
     print(error) 
    } 

    uploadWithAlamofire(image: photoImage, imageData: imageData, imageUrl: imageUrl) 

    self.dismiss(animated: true, completion: nil) 
} 
+0

Veuillez vérifier si cela fonctionne. https://stackoverflow.com/questions/47151184/swift-http-load-failed-error-code-1005-4-4-while-uploading-image-throu –

Répondre

0

Utilisez cette fonction pour télécharger l'image sur le serveur avec jeton et paramètres

func uploadImageAndData(){ 

var parameters = [String:AnyObject]() 
parameters = ["token": token, 
       "Name": Name] 

let URL = "http://yourserviceurl/" 
let image = UIImage(named: "image.png") 

Alamofire.upload(.POST, URL, multipartFormData: { 
    multipartFormData in 

    if let imageData = UIImageJPEGRepresentation(image, 0.6) { 
     multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png") 
    } 

    for (key, value) in parameters { 
     multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
    } 
}, encodingCompletion: { 
    encodingResult in 

    switch encodingResult { 
    case .Success(let upload, _, _): 
     print("s") 
     upload.responseJSON { 
      response in 
      print(response.request) // original URL request 
      print(response.response) // URL response 
      print(response.data)  // server data 
      print(response.result) // result of response serialization 

      if let JSON = response.result.value { 
       print("JSON: \(JSON)") 
      } 
     } 
    case .Failure(let encodingError): 
     print(encodingError) 
    } 
})} 

Works pour le Alamofire 3.0+

+0

Si mes paramètres apportent [String: Data] comme mon exemple . pour (clé, valeur) dans les paramètres {multipartFormData.appendBodyPart (data: valeur.dataUsingEncoding (NSUTF8StringEncoding) !, nom: clé)}. valeur ne pas avoir datausingEncoding –

1

Essayez ceci:

func uploadImageWith(param params:Dictionary<String,String>,image:UIImage?,handler:@escaping ((Dictionary<String,Any>?,Int) -> Void)) { 
    // let keyJson = "json".dataUsingEncoding(NSUTF8StringEncoding)! 
    print("Params:\(params)") 
    let BASE_URL = "http://" 
    Alamofire.upload(
     multipartFormData: { multipartFormData in 
      for (key, value) in params { 
       multipartFormData.append(value.data(using: String.Encoding.utf8, allowLossyConversion: false)!, withName: key) 
      } 

      if image != nil{ 
       let imgData = UIImageJPEGRepresentation(image!, 0.5) 
       if imgData != nil { 
        multipartFormData.append(imgData!, withName: "photo_upload", fileName: "file.png", mimeType: "image/png") 
       } 
      } 
    }, 
     to: BASE_URL, 
     encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .success(let upload, _, _): 
       upload.responseJSON { response in 

        switch response.result { 
        case .success: 
         if let jsonDict = response.result.value as? Dictionary<String,Any> { 
          print_debug("Json Response: \(jsonDict)") // serialized json response 
          handler(jsonDict,(response.response!.statusCode)) 
         } 
         else{ 
          handler(nil,(response.response!.statusCode)) 
         } 
         if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { 
          print("Server Response: \(utf8Text)") // original server data as UTF8 string 
         } 
         break 
        case .failure(let error): 
         handler(nil,(response.response!.statusCode)) 
         break 
        } 
       } 
      case .failure(let encodingError): 
       print(encodingError) 
      } 
    } 
    ) 
} 

UTILISATION

uploadImageWith(param: ["key":"value"], image: UIImage(name:"icon")) { (response, statusCode) in 
    print(response) 
} 

Vous devez passer les params et objets d'image et vous obtenez la réponse comme un objet Dictionary dans la fermeture.