Ios 如何使用alamofire上传带有其他用户详细信息的用户图像作为参数,我使用的是alamofire(4.5.1)
我尝试了下面的代码,但它抛出了一个错误 “失败:responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(错误域=NSCOAErrorDomain代码=3840”字符1周围的无效值。“用户信息={NSDebugDescription=字符1周围的无效值。}”)”Ios 如何使用alamofire上传带有其他用户详细信息的用户图像作为参数,我使用的是alamofire(4.5.1),ios,xcode,swift3,alamofire,Ios,Xcode,Swift3,Alamofire,我尝试了下面的代码,但它抛出了一个错误 “失败:responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(错误域=NSCOAErrorDomain代码=3840”字符1周围的无效值。“用户信息={NSDebugDescription=字符1周围的无效值。}”)” 我在ServiceHendler.swift文件中创建的以下方法 func uplo
我在ServiceHendler.swift文件中创建的以下方法
func uploadImageWithAlamofire(Parameters params : [String : AnyObject]?,ImageParameters imgparams : [NSObject : AnyObject]?,VideoParameters vidoparam : [NSObject : AnyObject]?,Action action : NSString, success: @escaping (AnyObject) -> Void, failure: @escaping (AnyObject) -> Void)
{
var base_url = "BASEURL"
base_url.append("Profile/ProfilePhoto")
let ACCESS_TOKEN = UserDefaults.standard.value(forKey: "access_token")
let ACCESS_TYPE = UserDefaults.standard.value(forKey: "token_type")
let Auth_Token : NSString = "\(ACCESS_TYPE as! String) \(ACCESS_TOKEN as! String)" as NSString
let headers:[String:String] = [
"Authorization": Auth_Token as String,
"Content-Type": "application/json"
]
Alamofire.upload(multipartFormData: { multipartFormData in
if imgparams != nil{
for (key, value) in imgparams! {
if let imageData = UIImageJPEGRepresentation(value as! UIImage, 0.7) {
multipartFormData.append(imageData, withName: key as! String, fileName: "FILENAME.png", mimeType: "image/png")
}
}
}
if vidoparam != nil{
for (key, value) in vidoparam! {
multipartFormData.append(value as! URL , withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000).mp4", mimeType: "application/octet-stream")
}
}
if params != nil
{
for (key, value) in params! {
multipartFormData.append((value as! String).data(using: .utf8)!, withName: key as! String)
}
}
}, to: base_url, method: .post, headers: headers,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.uploadProgress { progress in
print(progress.fractionCompleted)
}
upload.response { [weak self] response in
guard self != nil else {
return
}
let responseString = String(data: response.data!, encoding: String.Encoding.utf8)
DispatchQueue.main.async {
return success(responseString as AnyObject)
}
}
case .failure(let encodingError):
print("error:\(encodingError)")
return failure(encodingError as AnyObject)
}
})
}
let imgparam : NSMutableDictionary = NSMutableDictionary()
imgparam.setValue(UserProfileImg.image == nil ? UIImage.init() : UserProfileImg.image!, forKey: "YOURWEBSERVICEPARAMKEY")
}
// create another NSMutableDictionary for your regular param like username , first name , bob , gender , amount , etc. same and just pass that param in parameter file
ServiceHendler.uploadImageWithAlamofire(Parameters: nil, ImageParameters: imgparam as [NSObject : AnyObject], VideoParameters: nil, Action: "", success: { (Success) in
if let newdata : NSString = Success as? NSString{
let data: Data? = newdata.data(using: String.Encoding.utf8.rawValue)
let json: Any? = try? JSONSerialization.jsonObject(with: data!, options: [])
let arraydata : NSDictionary = json as! NSDictionary
print(arraydata)
if let result :NSString = arraydata.value(forKey: "Result") as? NSString{
self.imagename = result
}
else{
AppUtilities.sharedInstance.hideLoader()
AppUtilities.sharedInstance.showAlert(title: "Error", msg: "Something might be wronge.")
}
}
}) { (error) in
print(error)
}
像这样调用此方法也可以通过image传递更多参数
func uploadImageWithAlamofire(Parameters params : [String : AnyObject]?,ImageParameters imgparams : [NSObject : AnyObject]?,VideoParameters vidoparam : [NSObject : AnyObject]?,Action action : NSString, success: @escaping (AnyObject) -> Void, failure: @escaping (AnyObject) -> Void)
{
var base_url = "BASEURL"
base_url.append("Profile/ProfilePhoto")
let ACCESS_TOKEN = UserDefaults.standard.value(forKey: "access_token")
let ACCESS_TYPE = UserDefaults.standard.value(forKey: "token_type")
let Auth_Token : NSString = "\(ACCESS_TYPE as! String) \(ACCESS_TOKEN as! String)" as NSString
let headers:[String:String] = [
"Authorization": Auth_Token as String,
"Content-Type": "application/json"
]
Alamofire.upload(multipartFormData: { multipartFormData in
if imgparams != nil{
for (key, value) in imgparams! {
if let imageData = UIImageJPEGRepresentation(value as! UIImage, 0.7) {
multipartFormData.append(imageData, withName: key as! String, fileName: "FILENAME.png", mimeType: "image/png")
}
}
}
if vidoparam != nil{
for (key, value) in vidoparam! {
multipartFormData.append(value as! URL , withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000).mp4", mimeType: "application/octet-stream")
}
}
if params != nil
{
for (key, value) in params! {
multipartFormData.append((value as! String).data(using: .utf8)!, withName: key as! String)
}
}
}, to: base_url, method: .post, headers: headers,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.uploadProgress { progress in
print(progress.fractionCompleted)
}
upload.response { [weak self] response in
guard self != nil else {
return
}
let responseString = String(data: response.data!, encoding: String.Encoding.utf8)
DispatchQueue.main.async {
return success(responseString as AnyObject)
}
}
case .failure(let encodingError):
print("error:\(encodingError)")
return failure(encodingError as AnyObject)
}
})
}
let imgparam : NSMutableDictionary = NSMutableDictionary()
imgparam.setValue(UserProfileImg.image == nil ? UIImage.init() : UserProfileImg.image!, forKey: "YOURWEBSERVICEPARAMKEY")
}
// create another NSMutableDictionary for your regular param like username , first name , bob , gender , amount , etc. same and just pass that param in parameter file
ServiceHendler.uploadImageWithAlamofire(Parameters: nil, ImageParameters: imgparam as [NSObject : AnyObject], VideoParameters: nil, Action: "", success: { (Success) in
if let newdata : NSString = Success as? NSString{
let data: Data? = newdata.data(using: String.Encoding.utf8.rawValue)
let json: Any? = try? JSONSerialization.jsonObject(with: data!, options: [])
let arraydata : NSDictionary = json as! NSDictionary
print(arraydata)
if let result :NSString = arraydata.value(forKey: "Result") as? NSString{
self.imagename = result
}
else{
AppUtilities.sharedInstance.hideLoader()
AppUtilities.sharedInstance.showAlert(title: "Error", msg: "Something might be wronge.")
}
}
}) { (error) in
print(error)
}
尝试此方法,您甚至可以创建一个循环,就像您为设置参数而创建的一样。(Swift 2.x) 上传方式
func hitServiceUploadFile(fileURL:NSURL, fileName:String, timeStamp:String, token: String)
{
//Convert all parameters into Data format and send fileData as URL
Alamofire.upload(
.POST,
URL + "profile/update_profile",
multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(fileURL: fileURL, name: "Filedata")
multipartFormData.appendBodyPart(data: value1.dataUsingEncoding(NSUTF8StringEncoding)!, name: "Key1")
multipartFormData.appendBodyPart(data: value2.dataUsingEncoding(NSUTF8StringEncoding)!, name: "Key2")
multipartFormData.appendBodyPart(data: value3.dataUsingEncoding(NSUTF8StringEncoding)!, name: "Key3")
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseString { response in
print(response)
}
}
}
case .Failure(_):
self.hideIndicator()
}
}
)
}
multipartFormData.appendBodyPart(数据:image1Data,名称:“file”,文件名:“myImage.png”,mimeType:“image/png”)将您的这行代码替换为这行代码我想您建议的不是swift 3did,您只将图像上传到服务器中,您还传递了一些其他参数吗?我必须传递其他参数,如用户名、dob、, etc@AnilKumar检查更新的另一个并阅读我在答案中的描述。