如何使用 Alamofire POST 请求将图像作为 Base64String 发送以及如何在 Asp.net MVC4 web Api 控制器中处理请求?

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

iOS 的新手,在我的项目中,我使用 Alamofire(3.0.0) 作为后端 asp.net MVC4 web Api。 我已经通过这种方式将我的图像转换为 base64string

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
}
    }

我的 Alamofire 请求如下

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)

}

最后我的Api接受请求的控制器是

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

使用 Alamofire 将图像发送到网络 api 是否正确?我得到的响应状态为 404?如何使用 Alamofire 和 swift 将图像发送到 asp.net mvc4 web api 以及如何在 Api Controller 中处理请求?

目前我正在做的是这个...

从ImagePicker中获取Image并将其转换为Base64字符串并将其分配给一个变量供以后使用...

注意:我正在压缩我的图像以使其更小并将该代码也放入

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)

    }

//压缩图片

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)!
}

这是我的方法 (IBAction),我将用户配置文件详细信息发送到服务器,其中包含 Base64 图像作为字符串

@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")      
            }
        }
     }

这是我的 Asp.Net MVC 控制器操作

[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;

        }

现在一切都按照我需要的方式工作...:)