如何上传图像作为参数,其他参数使用 ios、swift3、Alamofire 4 中的多部分表单数据
How to upload image as a parameter, with other parameters using multipart form data in ios, swift3, Alamofire 4
我正在使用 Alamofire 4 with swift 3
更新用户个人资料。而且我正在使用 Router
class。我需要的是 uplaod
和其他参数的图像。我可以 update
用户详细信息,无需上传图片部分。
这是postman
中的样子
是否可以为此创建一个 urlconvertible 请求。我怎样才能上传带有其他参数的图像。 (这在邮递员中很好用)。我怎样才能用新 Alamofire
做到这一点。我试过如下。
let parameters = [
"profile_image": "swift_file.jpeg"
]
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png")
for (key, value) in parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
}, to:urltoUpdate)
{ (result) in
switch result {
case .success(let upload, _, _):
print("the status code is :")
upload.uploadProgress(closure: { (progress) in
print("something")
})
upload.responseJSON { response in
print("the resopnse code is : \(response.response?.statusCode)")
print("the response is : \(response)")
}
break
case .failure(let encodingError):
print("the error is : \(encodingError.localizedDescription)")
break
}
}
但这不能正常工作。希望您对这部分有所帮助。
你不需要这个:
"profile_image": "swift_file.jpeg"
参数应该是:
let parameters = [
"firstname": "Bill",
"surname": "fox",
//...rest of the parameters
]
还有这个withName: "file"
:
multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png")
应该是withName: "profile_image"
:
multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png")
代码 Headers:
let parameters = [
"firstname": "Bill",
"surname": "fox",
//...rest of the parameters
]
let headers = [
"somekey": "somevalue",
//...rest of the parameters
]
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png")
for (key, value) in parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
}, usingThreshold:UInt64.init(),
to: "", //URL Here
method: .post,
headers: headers, //pass header dictionary here
encodingCompletion: { (result) in
switch result {
case .success(let upload, _, _):
print("the status code is :")
upload.uploadProgress(closure: { (progress) in
print("something")
})
upload.responseJSON { response in
print("the resopnse code is : \(response.response?.statusCode)")
print("the response is : \(response)")
}
break
case .failure(let encodingError):
print("the error is : \(encodingError.localizedDescription)")
break
}
})
只需将此方法放入 NSObjecte
文件中即可。
导入 Alamofire`
class func postImageToUrl(_ serverlink:String,methodname:String,param:NSDictionary,image:UIImage!,withImageName : String,CompletionHandler:@escaping (Bool,NSDictionary) -> ()) {
print("POST : " + serverlink + methodname + " and Param \(param) ")
var fullLink = serverlink
if fullLink.characters.count > 0 {
fullLink = serverlink + "/" + methodname
}
else {
fullLink = methodname
}
var imgData = Data()
if image != nil {
imgData = UIImageJPEGRepresentation(image!, 1.0)!
}
let notallowchar : CharacterSet = CharacterSet(charactersIn: "01234").inverted
let dateStr:String = "\(Date())"
let resultStr:String = (dateStr.components(separatedBy: notallowchar) as NSArray).componentsJoined(by: "")
let imagefilename = resultStr + ".jpg"
Alamofire.upload(multipartFormData:{ multipartFormData in
multipartFormData.append(imgData, withName: withImageName as String, fileName: imagefilename, mimeType: "image/jpeg")
for (key, value) in param {
//let data = (value as! String).data(using: String.Encoding.utf8)!
let data = (value as AnyObject).data(using: String.Encoding.utf8.rawValue)
multipartFormData.append(data!, withName: key as! String)
}
},
usingThreshold:UInt64.init(),
to:fullLink,
method:.post,
headers:[:],
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.uploadProgress { progress in // main queue by default
print("Upload Progress: \(progress.fractionCompleted)")
}
upload.responseJSON { response in
print(response)
if let TempresponseDict:NSDictionary = response.result.value as? NSDictionary {
if (TempresponseDict.object(forKey: "response") as? String)?.caseInsensitiveCompare("success") == .orderedSame {
CompletionHandler(true, TempresponseDict)
}
else {
var statusCode = response.response?.statusCode
if let error = response.result.error as? AFError {
statusCode = error._code // statusCode private
switch error {
case .invalidURL(let url):
print("Invalid URL: \(url) - \(error.localizedDescription)")
case .parameterEncodingFailed(let reason):
print("Parameter encoding failed: \(error.localizedDescription)")
print("Failure Reason: \(reason)")
case .multipartEncodingFailed(let reason):
print("Multipart encoding failed: \(error.localizedDescription)")
print("Failure Reason: \(reason)")
case .responseValidationFailed(let reason):
print("Response validation failed: \(error.localizedDescription)")
print("Failure Reason: \(reason)")
switch reason {
case .dataFileNil, .dataFileReadFailed:
print("Downloaded file could not be read")
case .missingContentType(let acceptableContentTypes):
print("Content Type Missing: \(acceptableContentTypes)")
case .unacceptableContentType(let acceptableContentTypes, let responseContentType):
print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)")
case .unacceptableStatusCode(let code):
print("Response status code was unacceptable: \(code)")
statusCode = code
}
case .responseSerializationFailed(let reason):
print("Response serialization failed: \(error.localizedDescription)")
print("Failure Reason: \(reason)")
// statusCode = 3840 ???? maybe..
}
print("Underlying error: \(error.underlyingError)")
}
else if let error = response.result.error as? URLError {
print("URLError occurred: \(error)")
}
else {
print("Unknown error: \(response.result.error)")
}
print("\(statusCode)") // the status code
CompletionHandler(false, TempresponseDict)
}
}
else {
CompletionHandler(false, NSDictionary())
}
}
case .failure(let encodingError):
print(encodingError)
CompletionHandler(false, NSDictionary())
}
})
}
2。使用
yourNSObjectClassName.postImageToUrl(MAIN_LINK, methodname: "MethodName", param: "ParametterInDictionary", image: "UploadImage", withImageName: "ImageParametterString") { (Success, responceOBJ) in
if Success == true
{
print("Your image is uploaded")
}
else
{
print("Fail")
}
}
并且您已将 web 服务的错误代码设置到服务器站点以显示错误,并且在您获得正确的成功之后。
我正在使用 Alamofire 4 with swift 3
更新用户个人资料。而且我正在使用 Router
class。我需要的是 uplaod
和其他参数的图像。我可以 update
用户详细信息,无需上传图片部分。
这是postman
是否可以为此创建一个 urlconvertible 请求。我怎样才能上传带有其他参数的图像。 (这在邮递员中很好用)。我怎样才能用新 Alamofire
做到这一点。我试过如下。
let parameters = [
"profile_image": "swift_file.jpeg"
]
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png")
for (key, value) in parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
}, to:urltoUpdate)
{ (result) in
switch result {
case .success(let upload, _, _):
print("the status code is :")
upload.uploadProgress(closure: { (progress) in
print("something")
})
upload.responseJSON { response in
print("the resopnse code is : \(response.response?.statusCode)")
print("the response is : \(response)")
}
break
case .failure(let encodingError):
print("the error is : \(encodingError.localizedDescription)")
break
}
}
但这不能正常工作。希望您对这部分有所帮助。
你不需要这个:
"profile_image": "swift_file.jpeg"
参数应该是:
let parameters = [
"firstname": "Bill",
"surname": "fox",
//...rest of the parameters
]
还有这个withName: "file"
:
multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png")
应该是withName: "profile_image"
:
multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png")
代码 Headers:
let parameters = [
"firstname": "Bill",
"surname": "fox",
//...rest of the parameters
]
let headers = [
"somekey": "somevalue",
//...rest of the parameters
]
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png")
for (key, value) in parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
}, usingThreshold:UInt64.init(),
to: "", //URL Here
method: .post,
headers: headers, //pass header dictionary here
encodingCompletion: { (result) in
switch result {
case .success(let upload, _, _):
print("the status code is :")
upload.uploadProgress(closure: { (progress) in
print("something")
})
upload.responseJSON { response in
print("the resopnse code is : \(response.response?.statusCode)")
print("the response is : \(response)")
}
break
case .failure(let encodingError):
print("the error is : \(encodingError.localizedDescription)")
break
}
})
只需将此方法放入 NSObjecte
文件中即可。
导入 Alamofire`
class func postImageToUrl(_ serverlink:String,methodname:String,param:NSDictionary,image:UIImage!,withImageName : String,CompletionHandler:@escaping (Bool,NSDictionary) -> ()) {
print("POST : " + serverlink + methodname + " and Param \(param) ")
var fullLink = serverlink
if fullLink.characters.count > 0 {
fullLink = serverlink + "/" + methodname
}
else {
fullLink = methodname
}
var imgData = Data()
if image != nil {
imgData = UIImageJPEGRepresentation(image!, 1.0)!
}
let notallowchar : CharacterSet = CharacterSet(charactersIn: "01234").inverted
let dateStr:String = "\(Date())"
let resultStr:String = (dateStr.components(separatedBy: notallowchar) as NSArray).componentsJoined(by: "")
let imagefilename = resultStr + ".jpg"
Alamofire.upload(multipartFormData:{ multipartFormData in
multipartFormData.append(imgData, withName: withImageName as String, fileName: imagefilename, mimeType: "image/jpeg")
for (key, value) in param {
//let data = (value as! String).data(using: String.Encoding.utf8)!
let data = (value as AnyObject).data(using: String.Encoding.utf8.rawValue)
multipartFormData.append(data!, withName: key as! String)
}
},
usingThreshold:UInt64.init(),
to:fullLink,
method:.post,
headers:[:],
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.uploadProgress { progress in // main queue by default
print("Upload Progress: \(progress.fractionCompleted)")
}
upload.responseJSON { response in
print(response)
if let TempresponseDict:NSDictionary = response.result.value as? NSDictionary {
if (TempresponseDict.object(forKey: "response") as? String)?.caseInsensitiveCompare("success") == .orderedSame {
CompletionHandler(true, TempresponseDict)
}
else {
var statusCode = response.response?.statusCode
if let error = response.result.error as? AFError {
statusCode = error._code // statusCode private
switch error {
case .invalidURL(let url):
print("Invalid URL: \(url) - \(error.localizedDescription)")
case .parameterEncodingFailed(let reason):
print("Parameter encoding failed: \(error.localizedDescription)")
print("Failure Reason: \(reason)")
case .multipartEncodingFailed(let reason):
print("Multipart encoding failed: \(error.localizedDescription)")
print("Failure Reason: \(reason)")
case .responseValidationFailed(let reason):
print("Response validation failed: \(error.localizedDescription)")
print("Failure Reason: \(reason)")
switch reason {
case .dataFileNil, .dataFileReadFailed:
print("Downloaded file could not be read")
case .missingContentType(let acceptableContentTypes):
print("Content Type Missing: \(acceptableContentTypes)")
case .unacceptableContentType(let acceptableContentTypes, let responseContentType):
print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)")
case .unacceptableStatusCode(let code):
print("Response status code was unacceptable: \(code)")
statusCode = code
}
case .responseSerializationFailed(let reason):
print("Response serialization failed: \(error.localizedDescription)")
print("Failure Reason: \(reason)")
// statusCode = 3840 ???? maybe..
}
print("Underlying error: \(error.underlyingError)")
}
else if let error = response.result.error as? URLError {
print("URLError occurred: \(error)")
}
else {
print("Unknown error: \(response.result.error)")
}
print("\(statusCode)") // the status code
CompletionHandler(false, TempresponseDict)
}
}
else {
CompletionHandler(false, NSDictionary())
}
}
case .failure(let encodingError):
print(encodingError)
CompletionHandler(false, NSDictionary())
}
})
}
2。使用
yourNSObjectClassName.postImageToUrl(MAIN_LINK, methodname: "MethodName", param: "ParametterInDictionary", image: "UploadImage", withImageName: "ImageParametterString") { (Success, responceOBJ) in
if Success == true
{
print("Your image is uploaded")
}
else
{
print("Fail")
}
}
并且您已将 web 服务的错误代码设置到服务器站点以显示错误,并且在您获得正确的成功之后。