Search code examples
c#iosswift2alamofirealamofireimage

How to Send Image as Base64String using Alamofire POST request and how to handle the request in Asp.net MVC4 web Api Controller?


A newbie in iOS and for my project I am using Alamofire(3.0.0) and as Backend asp.net MVC4 web Api. I have converted my image to base64string this way

swift 2.0

var userProfileImage : String = ""
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

 if let _image = info["UIImagePickerControllerEditedImage"] as? UIImage
                //if let _image = info["UIImagePickerControllerOriginalImage"] as? UIImage
                {
                    capturedImage = _image

                    self.profilePicture.image = _image
                    //cache.saveImage(capturedImage, path: _cache.fileInDocumentsDirectory("profileImage"))
                    let imagetosave = UIImageJPEGRepresentation(_image, 1.0)
                    let base64encodedImage  = imagetosave!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 


userProfileImage = base64encodedImage
}
else if let _image = info["UIImagePickerControllerOriginalImage"] as? UIImage

{
 let __image = UIImageJPEGRepresentation(_image,1.0)
                            let base64encodedImage = __image!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))


 userProfileImage = base64encodedImage
}
    }

and my Alamofire Request is as follows

let params = ["userid":"\(user)" , "firstname":"\(String(_firstName))" , "middlename":"\(String(_middlename))","lastname":"\(String(_lastname))","email":"\(String(_email))","base64String":"\(userProfileImage)"]
     Alamofire.request(.POST, App.AppHomeURL() + "Update_Profile", parameters : params, encoding : .JSON).responseJSON{
            response in
 case .Success(let data) :
  let json = JSON(data)

                print("JSON DATA  : \(json)")
case .Failure(let error):
print(error)

}

And finally my ApiController that accepts the request is

[System.Web.Http.HttpPost]
        public JsonResult Update_Profile(string userid, string firstname, string middlename, string lastname, string email, string base64String)
        {
     // code goes here ...
}

is it the right way to send an image to a web api using Alamofire I got the response status as 404 ? How to send image using Alamofire and swift to asp.net mvc4 web api and how to handle the request in Api Controller ?


Solution

  • Currently what I am doing is this...

    Get the Image from ImagePicker and convert it to Base64 string and assign it to a variable for later use...

    Note : I am compressing my Image to make it smaller and putting that code too

    var userProfileImage : String = ""
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
         let capturedImage : UIImage
         if let _image = info["UIImagePickerControllerEditedImage"] as? UIImage
                {
                     capturedImage = _image
                     self.profilePicture.image = _image
    
                     let _image_compressed = compressImage(_image)
                     let imagetosave = UIImageJPEGRepresentation(_image_compressed , 1.0)
                     let base64encodedImage  = imagetosave!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
                     userProfileImage =  base64encodedImage
                }
                else if let _image = info["UIImagePickerControllerOriginalImage"] as? UIImage
                             {
                                capturedImage = _image
                                let _imageCompressed = compressImage(_image)
                                let __image = UIImageJPEGRepresentation(_imageCompressed , 1.0)
                                let base64encodedImage = __image!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue : 0))
                                userProfileImage =  base64encodedImage
                                self.profilePicture.image = _image
                              }
                                else
                                   {
                                       return
                                   }
                                     dismissViewControllerAnimated(true, completion: nil)
    
        }
    

    // Compress the image

    func compressImage(image : UIImage) -> UIImage
    {
        var _actualImageHeight : CGFloat = image.size.height
        var _actualImageWidth : CGFloat = image.size.width
        let _maxHeight : CGFloat = 300.0
        let _maxWidth : CGFloat = 400.0
        var _imageRatio : CGFloat = _actualImageWidth / _actualImageHeight
        let _maxRatio: CGFloat = _maxWidth / _maxHeight
        let _imageCompressionQuality : CGFloat = 0.5 // makes the image get compressed to 50% of its actual size
    
        if _actualImageHeight > _maxHeight || _actualImageWidth > _maxWidth
        {
            if _imageRatio < _maxRatio
            {
                // Adjust thw width according to the _maxHeight
                _imageRatio = _maxHeight / _actualImageHeight
                _actualImageWidth = _imageRatio * _actualImageWidth
                _actualImageHeight = _maxHeight
            }
            else
            {
                if _imageRatio > _maxRatio
                {
                    // Adjust height according to _maxWidth
                    _imageRatio = _maxWidth / _actualImageWidth
                    _actualImageHeight = _imageRatio * _actualImageHeight
                    _actualImageWidth = _maxWidth
                }
                else
                {
                    _actualImageHeight = _maxHeight
                    _actualImageWidth = _maxWidth
                }
    
            }
        }
        let _compressedImage : CGRect = CGRectMake(0.0 , 0.0 , _actualImageWidth , _actualImageHeight)
        UIGraphicsBeginImageContext(_compressedImage.size)
        image.drawInRect(_compressedImage)
        let img: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        let imageData: NSData = UIImageJPEGRepresentation(img, _imageCompressionQuality)!
        UIGraphicsEndImageContext()
        return UIImage(data: imageData)!
    }
    

    This is my Method(IBAction) where I send User Profile details to the server that includes the Base64 image as String

    @IBAction func saveUserDetails(sender: AnyObject)  {
         let _oldpass = userOldPassword.text!
         let _newPass = userNewPassword.text!
         let _newPassCoonfirm = userRetypedPassword.text!
         let _email : String = userEmail.text!
         var _firstName : String = ""
         let _middlename : String = userMiddleName.text!
         let _lastname : String = userLastName.text!
         let _pass : String = userNewPassword.text!
         var _profileImage : String = ""
    
              if let profileImage = self.userProfileImage as? String
                     {
                         _profileImage = profileImage
                     }   
                          else
                               {
                                 _profileImage = ""
                               }
    
              if let _first = userFirstName.text! as? String
                    {
                         _firstName = _first
                    }
                        else
                              {
                                _firstName = ""
                              }
    
            let params = ["firstname":"\(String(_firstName))"
                ,"middlename":"\(String(_middlename))"
                ,"lastname":"\(String(_lastname))"
                ,"password":"\(String(_pass))"
                ,"email":"\(String(_email))"
                ,"oldpassword":"\(_oldpass)"
                ,"base64String":"\(_profileImage)"]
    
                Alamofire.request(.POST, App.AppHomeURL() + "Update_Profile", parameters : params , encoding : .JSON).responseJSON{
                      response in
                            switch response.result {
                                   case .Success(let data) :
                                        let json = JSON(data)
                                        let ProfileEdit = json["Data"]
                                            if (ProfileEdit) 
                                               {
                                                 print("true")
                                               }
    
                                   case .Failure(let _error):
                                           print("false")      
                }
            }
         }
    

    And this is my Asp.Net MVC Controller Action

    [route.System.Web.Http.HttpPost]
            [HttpRoute("api/Home/Update_Profile")]
            public JsonResult Update_Profile([FromBody]UpdateProfileViewModel updateprofileviewmodel)
            {
                UserModel usermodelforemail = Helper.FindUserByEmail(updateprofileviewmodel.email);
                System.Web.Mvc.JsonResult usertoreturn = new System.Web.Mvc.JsonResult();
                UserModel usermodel = new UserModel();
                usermodel = FridgeHelper.FindUserByObjectId(updateprofileviewmodel.userid);
                usermodel.FirstName = updateprofileviewmodel.firstname;
                usermodel.MiddleName = updateprofileviewmodel.middlename;
                usermodel.LastName = updateprofileviewmodel.lastname;
                usermodel.Email = updateprofileviewmodel.email;
    
                 //save photo
                if (updateprofileviewmodel.base64String != null)
                {
                    byte[] imageBytes = Convert.FromBase64String(updateprofileviewmodel.base64String);
                    MemoryStream ms = new MemoryStream(imageBytes, 0,
                      imageBytes.Length);
                    // Convert byte[] to Image
                    ms.Write(imageBytes, 0, imageBytes.Length);
                    Image image = Image.FromStream(ms, true);
                    string filenametosave = usermodel._id + "." + System.Drawing.Imaging.ImageFormat.Jpeg;
                    var path = System.Web.Hosting.HostingEnvironment.MapPath("~/Content/UserProfilePictures/" + filenametosave);
                    if (System.IO.File.Exists(path))
                    {
                        System.IO.File.Delete(path);
                    }
                    image.Save(path);
                    usermodel.Photo = filenametosave;
                }
    
                bool resultvalue = false;
                resultvalue = Helper.UpdateUser(usermodel);
    
                if (resultvalue)
                {
                    usertoreturn.Data = "true";
                }
                else
                {
                    usertoreturn.Data = "false";
                }
                return usertoreturn;
    
            }
    

    Now everything is working the way I needed... :)