如何使用 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;
}
现在一切都按照我需要的方式工作...:)
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;
}
现在一切都按照我需要的方式工作...:)