ios - 使用 HTTP POST 快速发送数组和图像
问题描述
我正在尝试在 Swift 中上传带有参数的图像。我对参数中的数组有疑问
发布请求看起来像这样。
curl --request POST \
--url http://example.com/api/v2/upload-single-photo-restaurant \
--header 'Accept: application/json' \
--header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
--form lat=21.584739 \
--form lng=105.807110 \
--form device_id=TG23X44C \
--form name=Kitacy \
--form 'datetime=2018-05-15 08:54:00' \
--form 'categories[]=1' \
--form 'categories[]=2' \
--form photo=undefined
链接代码:https ://ideone.com/mSGWkD
这是我当前的代码
func myImageUploadRequest()
{
let myUrl = URL(string: "https://example.com/api/v2/upload-single-photo-restaurant");
let request = NSMutableURLRequest(url:myUrl!);
request.httpMethod = "POST";
let device_id = UIDevice.current.identifierForVendor!.uuidString
print("lat is:",lat!)
print("lng is:",lng!)
var param:[String:Any] = [
"lat" : lat!,
"lng" : lng!,
"device_id" : device_id,
"name" : photoName.text!,
"datetime" : Const.getDate()
] as [String : Any]
let boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let imageData = UIImageJPEGRepresentation(imgView.image!, 1)
if(imageData==nil) { return; }
request.httpBody = createBodyWithParameters(parameters: param as? [String : String], filePathKey: "photo", imageDataKey: imageData! as NSData, boundary: boundary) as Data
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, response, error in
if error != nil {
print("error=\(String(describing: error))")
return
}
// You can print out response object
print("******* response = \(String(describing: response))")
// Print out reponse body
let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print("****** response data = \(responseString!)")
do {
let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
print(json!)
DispatchQueue.main.async(execute: {
self.imgView.image = UIImage(named: "img")
let msg = json?.object(forKey: "message")
UIViewController.removeSpinner(spinner: self.sv!)
self.stackViewUpload.isHidden=true
self.alertWithMsg(msg: msg as! String)
})
}catch{
print(error)
}
}
task.resume()
}
func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
let body = NSMutableData();
if parameters != nil {
for (key, value) in parameters! {
body.appendString(string: "--\(boundary)\r\n")
body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.appendString(string: "\(value)\r\n")
}
}
let filename = "user-profile.jpg"
let mimetype = "image/jpg"
body.appendString(string: "--\(boundary)\r\n")
body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n")
body.append(imageDataKey as Data)
body.appendString(string: "\r\n")
body.appendString(string: "--\(boundary)--\r\n")
return body
}
extension NSMutableData {
func appendString(string: String) {
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
append(data!)
}
}
链接代码:https ://ideone.com/CPj1CO
现在如何将 category(Integer) 数组添加到参数中的 'categories []' 键中?
解决方案
推荐阅读
- android - 以编程方式在谷歌地图android中设置从位置到当前位置
- google-sheets - 如何将单元格引用到文本字符串中
- java - Spring Data 不记录 findById
- python - 类实例存储与最初给定不同的值
- excel - 将特定单元格相加到某个值,然后将剩余的单元格相乘
- f# - F# 中的引号转换为另一种类型
- spring-mvc - SpringMVC中注解@RequestMapping的属性名、值和路径的区别
- javascript - window.document.getElementById("link").setAttribute("href","www.google.com");
- java - 如何从光标中删除唯一值
- speech-recognition - Python Speech_Recognition 挂断了麦克风收听