2017-10-21 48 views
0

J'essaie de télécharger le fichier image sur mon serveur. L'écran ci-dessous montre l'appel par le facteur.Télécharger le fichier image à partir de l'application Swift

Avec KEY:"image" et Valeur:123.png [fichier image] dans le corps form-data.

enter image description here

Je veux mettre en œuvre la même chose dans mon application avec rapide. J'ai essayé une solution différente mais dint trouver une bonne solution.

Je suis une image de sélection avec l'aide de UIImagePicker:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
      { 
       let image = info[UIImagePickerControllerOriginalImage] as? UIImage 
       self.dismiss(animated: true, completion: nil) 
       uploadImage(image: image!, url: "profile_image/") 
      } 

J'appelle la fonction uploadImage télécharger l'image.

func uploadImage(image: UIImage, url: String) { 
     let urlString = "http://example.com/path/"+url 
     guard let url = URL(string: urlString) else { return } 
     let request = NSMutableURLRequest(url: url) 
     request.httpMethod = "POST" 
     let token = UserDefaults.standard.object(forKey: "token") as? String 
     request.addValue("Token "+token!, forHTTPHeaderField: "Authorization") 
     let imageData = UIImagePNGRepresentation(image)!.base64EncodedData() 
     //let postString = "image=\(imageData))" 
     //request.httpBody = postString.data(using: .utf8) 

    let imgDict = ["image": imageData] 

    do { 
     let jsonBody = try JSONEncoder().encode(imgDict) 
     print(jsonBody) 
     request.httpBody = jsonBody 
    } catch let jsonError { 
     print(" Parsing Error: "+jsonError.localizedDescription) 
    } 

     URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in 
      if error != nil { 
       print("Image upload API Error: "+error!.localizedDescription) 
      } 
      guard let data = data else { return } 
      do { 
       print(data) 
       let responseData = try JSONDecoder().decode(BasicResponseParameter.self, from: data) 
       print(responseData) 

       if responseData.success { 
        print("Image uploaded") 
       } 
       else { 
        print("Image upload API Failed : "+responseData.message!) 
        DispatchQueue.main.async(execute: { 
         popAlert(title: "FAILED", message: responseData.message!, owner:self) 
        }) 
       } 
      } catch let jsonError { 
       print("Image upload API JSON Error :"+jsonError.localizedDescription) 
      } 
      }.resume() 
    } 

Toute aide appréciée.

Répondre

0

Je suggère que vous encodez (lors de l'envoi de l'image sur votre serveur) et décoder (lors de l'interrogation de l'image arrière) de votre image dans base64 Format

Pour Encode

let img = /// this is your image 
let encodedString = UIImagePNGRepresentation(img)?.base64EncodedString() 

Pour décoder:

let data_from_response = /// from your response 
let decodeData = Data(base64Encoded: data_from) 

Puisque vous envoyez un dictionary sur votre corps de demande, vous devrez convertir votre dictionary à un json

guard let imgDataString = String.init(data: encodedString, encoding: String.Encoding.utf8) else { return } 

let imgDict = ["image": imgDataString ] 

let jsonData = try! JSONSerialization.data(withJSONObject: imgDict, options: .prettyPrinted) 

request.httpBody = jsonData 

Side Note Évitez implicit optional unwrapping signifie !, utilisez if let ou guard déclarations

+0

Remerciez vous beaucoup Lamar pour répondre :), j'ai encodé l'image avec .base64EncodedData(), im obtenir "Les données n'ont pas pu être lues parce que ce n'est pas dans le bon format." erreur –

+0

Lamar, je suis inquiet si j'envoie KEY & VALUE correctement. La clé et la valeur sont-elles dans le bon format/manière/manière? @Lamar –

+0

avez-vous correctement déplié votre image? – Lamar