4

iOS の初心者で、私のプロジェクトでは Alamofire(3.0.0) をバックエンド asp.net MVC4 Web Api として使用しています。この方法で画像をbase64stringに変換しました

スイフト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 Requestは次のとおりです

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)

}

そして最後に、リクエストを受け入れる私の ApiController は

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

Alamofire を使用して画像を Web API に送信するのは正しい方法ですか? Alamofireとswiftを使用して画像をasp.net mvc4 Web APIに送信する方法と、Api Controllerでリクエストを処理する方法は?

4

1 に答える 1

4

現在、私がしていることはこれです...

ImagePicker から画像を取得し、それを 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)!
}

これは、Base64 イメージを文字列として含むユーザー プロファイルの詳細をサーバーに送信するメソッド (IBAction) です。

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

        }

今、すべてが私が必要としていた方法で機能しています... :)

于 2016-10-08T07:46:37.707 に答える