[英]How to upload a image of user with other user details as parameters using alamofire, i am using Alamofire (4.5.1)
我已經嘗試了下面的代碼,但是拋出了錯誤“ FAILURE:responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain = NSCocoaErrorDomain Code = 3840“字符1周圍的無效值。” UserInfo = {NSDebugDescription =字符1周圍的無效值。})) ”
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 60
let data = UIImagePNGRepresentation(image)!
let request = manager.upload(multipartFormData:{ multipartFormData in
multipartFormData.append(data, withName: "userImage", mimeType: "image/png")
for (key, value) in params {
multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
}},
usingThreshold:UInt64.init(),
to:URL + "profile/update_profile",
method:.post,
headers: header,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
debugPrint(upload)
upload.responseJSON { response in
debugPrint(response)
}
case .failure(let encodingError):
print(encodingError)
}
})
我在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)
}
嘗試這種方法,您甚至可以像創建用於設置參數那樣創建一個循環。 (迅速2.x)
for (key, value) in params {
multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) }
上傳方式
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()
}
}
)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.