[英]how to upload file and pass data in parameter in Alamofire - swift 5
how to upload file and pass data in parameter in Alamofire - swift 5如何上传文件并在 Alamofire 中的参数中传递数据 - swift 5
I need a solution to this problem I want to upload a picture to the server with data inside the parameter我需要解决这个问题我想上传一张图片到服务器,参数里面有数据
This is the request on postman这是对邮递员的要求
This is my solution ::这是我的解决方案::
func createPhoto(name : String , email : String,gender:String,region:String,bod:String,activity_name:String,organisation_name:String,photo: UIImage, completion: @escaping (_ error: Error?, _ success: Bool)->Void) {
var Token : String?
var tasksMO = [NSManagedObject]()
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "ConfirmActivationEntity")
do {
let results = try pe.context.fetch(request)
tasksMO = results as! [NSManagedObject]
for taskmo in tasksMO {
Token = (taskmo.value(forKey: "access_token") as! String )
}
print("assbil")
} catch {
print("fild")
}
print(" Token :\(Token!)")
let headers : HTTPHeaders = ["Authorization":"Bearer \(Token!)","X-HTTP-Method-Override":"PUT","Accept-Language" : Locale.current.languageCode ?? "ar", "Content-Type" : "application/x-www-form-urlencoded","Accept" : "application/json"]
let parameters : Parameters = ["name" : name,"region":region,"activity_id":ActivityCode!,"organization_id":OrganizationCode!,"gender":gender,"job_id":JobCode!,"interest_id":IntrestedCode!,"organisation_name":organisation_name,"activity_name":activity_name,"bod":bod,"city":region,"email":email,"profile_pic":photo]
guard let url = URL(string: "\(UrlApi.url)\(UrlApi.crateUser)") else { return }
Alamofire.upload(multipartFormData: { (form: MultipartFormData) in
for (key, value) in parameters {
form.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
}
// if let data = imagedata{
// multipartFormData.append(data, withName: "imagename", fileName: "imagename.jpg", mimeType: "image/jpeg")
// }
if let data = photo.jpegData(compressionQuality: 0.5) {
form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
}
}, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: url,method: .post, headers: headers) { (result: SessionManager.MultipartFormDataEncodingResult) in
switch result {
case .failure(let error):
print(error)
completion(error, false)
case .success(request: let upload, streamingFromDisk: _, streamFileURL: _):
upload.uploadProgress(closure: { (progress: Progress) in
print(progress)
})
.responseJSON(completionHandler: { (response: DataResponse<Any>) in
switch response.result
{
case .failure(let error):
print(error)
completion(error, false)
case .success(let value):
let json = JSON(value)
print(json)
if let status = json["status"].toInt, status == 1 {
// success
print("Upload Succeed")
completion(nil, true)
} else {
print("Upload Failed")
completion(nil, false)
}
}
})
}
}
}
And this response comes from the serve :这个响应来自服务:
responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
I am using the Alamofire pod and the SwiftyJson pod with iOS 13, swift 5 and Xcode 11我在 iOS 13、swift 5 和 Xcode 11 上使用 Alamofire pod 和 SwiftyJson pod
Please help me :)请帮我 :)
Don't include image in parameters dictionary.不要在参数字典中包含图像。 Or skip that when adding to MultipartFormData as follows
或者在添加到 MultipartFormData 时跳过它,如下所示
Alamofire.upload(multipartFormData: { form in
for (key, value) in parameters {
if !(value is UIImage), let data = "\(value)".data(using: .utf8) {
form.append(data, withName: key as String)
}
}
if let data = photo.jpegData(compressionQuality: 0.5) {
form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
}
}
You should pass the image data in MultipartFormData
instead of passing with the other parameter in the parameter
dictionary.您应该在
MultipartFormData
中传递图像数据,而不是与parameter
字典中的其他参数一起传递。
Just change your code like below and check it is working or not.只需像下面一样更改您的代码并检查它是否有效。
//Remove profile pic param from parameters.
let parameters : Parameters = ["name" : name,"region":region,"activity_id":ActivityCode!,"organization_id":OrganizationCode!,"gender":gender,"job_id":JobCode!,"interest_id":IntrestedCode!,"organisation_name":organisation_name,"activity_name":activity_name,"bod":bod,"city":region,"email":email]
guard let url = URL(string: "\(UrlApi.url)\(UrlApi.crateUser)") else { return }
Alamofire.upload(multipartFormData: { (form: MultipartFormData) in
for (key, value) in parameters {
form.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
}
if let data = photo.jpegData(compressionQuality: 0.5) {
form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.