我需要向服务器发送POST请求,这些是参数
let params : NSDictionary = ["userid":"\(userID)","sessionid":"\(sessionID)","site_id": "\(siteIDParam)", "latitude":"\(currentlatitude)", "longitude":"\(currentlongitude)", "action": "1", "comments":commentTextView.text ?? ""]
但问题是我需要将图像作为字节数组发送,我使用以下代码(Swift 3)
func uploadImageRequest(image: UIImage? , urlString: String, imageName : String ,param: [String: AnyObject]? , completion:@escaping(_ success:Bool , _ object : AnyObject?) -> ())
{
let url = NSURL(string: urlString)
let request = NSMutableURLRequest(url: url! as URL)
request.httpMethod = "POST"
let boundary = generateBoundaryString()
//define the multipart request type
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
if (image == nil)
{
return
}
let image_data = UIImageJPEGRepresentation(image!, 0.5)
if(image_data == nil)
{
return
}
let body = NSMutableData()
let fname = "photo.png"
let mimetype = "image/*"
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition:form-data; name=\"\(imageName)\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append(image_data!)
body.append("\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
if param != nil {
for (key, value) in param! {
body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.append("\(value)\r\n")
}
}
request.httpBody = body as Data
_ = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
if let data = data {
// Json Response
let json = try? JSONSerialization.jsonObject(with: data, options: [])
// response.
if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
completion(true, json as AnyObject?)
} else {
completion(false, json as AnyObject?)
}
} else {
completion(false, error?.localizedDescription as AnyObject?)
}
}.resume()
}
图像未正确转换我猜是因为触发时响应失败并且我收到以下错误
Message = "No HTTP resource was found that matches the request URI
此API在Android设备中运行良好,但在iOS中无法实现。我搜索了所有的链接,我无法得到一个适当的解决方案。我也尝试过使用Alamofire,但我仍然遇到了同样的错误。
您必须在.plist文件中的NSAllowsArbitraryLoads
YES
下将NSAppTransportSecurity
密钥设置为dictionary
。
您可以使用alamofire轻松完成此操作,使用以下代码完成这些操作。
let multipartHeaders = ["Content-Type":"multipart/form-data"]
let paramString: String = "parameters in json string..."
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(paramString.data(using: .utf8)!, withName: "json")
multipartFormData.append(<imageDataHere>, withName: "myimage", fileName: "myImage.jpeg", mimeType: "image
jpeg")
}, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: url, method: .post, headers:
multipartHeader) { (encodingResult) in
switch encodingResult {
case .success(let request, _, _):
request.responseJSON(completionHandler: { (response) in
print(response)
})
case .failure(let error):
print(error.localizedDescription)
}
}
这段代码帮助我解决了我的问题。我只是将我的图像作为文件发送,将剩余参数作为字符串发送,而不将其附加到我的多部分主体。
let imageData = UIImageJPEGRepresentation(userImage, 0.2)!
let docDir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let imageURL = docDir.appendingPathComponent("tmp.jpg")
try! imageData.write(to: imageURL)
let multipartHeaders = ["Content-Type":"multipart/form-data"]
let paramString: String = "userid=\(userId)&action=1"
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(imageURL, withName: "profilepic")
}, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: URL(string: ATTENDANCE_URL+paramString)!, method: .post, headers:
multipartHeaders) { (encodingResult) in
switch encodingResult {
case .success(let request, _, _):
request.responseJSON(completionHandler: { (response) in
print(response.result.value)
let value = response.result.value as! [String: Any]
})
case .failure(let error):
print(error.localizedDescription)
}
}