我想将图像作为参数与我的请求一起发送。 我使用下面的代码来调用我的POST请求,但我不知道如何将图像附加到身体上。
我通过图像选择器获取图像如下:
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
我的请求如下:
var request = URLRequest(url: URL(string: "")!) // link removed
request.httpMethod = "POST"
let postString = "user_id=\(userId)&image=\(image)"
request.httpBody = postString.data(using:.utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
return
}
do {
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? AnyObject
if let parseJSON = json {
print("resp :\(parseJSON)")
}
} catch let error as NSError {
print("error : \(error)")
}
}
task.resume()
我是Swift的新手。我通过multipart / form-data看到了这个,但是我自己无法实现它。我不想用base 64格式编码。请帮助我。
答案 0 :(得分:17)
我使用以下结构发送图像:
func createRequestBodyWith(parameters:[String:NSObject], filePathKey:String, boundary:String) -> NSData{
let body = NSMutableData()
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")
}
body.appendString(string: "--\(boundary)\r\n")
var mimetype = "image/jpg"
let defFileName = "yourImageName.jpg"
let imageData = UIImageJPEGRepresentation(yourImage, 1)
body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(defFileName)\"\r\n")
body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n")
body.append(imageData!)
body.appendString(string: "\r\n")
body.appendString(string: "--\(boundary)--\r\n")
return body
}
func generateBoundaryString() -> String {
return "Boundary-\(NSUUID().uuidString)"
}
extension NSMutableData {
func appendString(string: String) {
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
append(data!)
}
然后在你的功能中你创建这样的身体:
request.httpBody = self.createRequestBodyWith(parameters:yourParamsDictionary, filePathKey:yourKey, boundary:self.generateBoundaryString)
答案 1 :(得分:3)
Swift 4.2
func uploadImage(paramName: String, fileName: String, image: UIImage) {
let url = URL(string: "http://api-host-name/v1/api/uploadfile/single")
// generate boundary string using a unique per-app string
let boundary = UUID().uuidString
let session = URLSession.shared
// Set the URLRequest to POST and to the specified URL
var urlRequest = URLRequest(url: url!)
urlRequest.httpMethod = "POST"
// Set Content-Type Header to multipart/form-data, this is equivalent to submitting form data with file upload in a web browser
// And the boundary is also set here
urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
var data = Data()
// Add the image data to the raw http request data
data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"\(paramName)\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!)
data.append("Content-Type: image/png\r\n\r\n".data(using: .utf8)!)
data.append(image.pngData()!)
data.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
// Send a POST request to the URL, with the data we created earlier
session.uploadTask(with: urlRequest, from: data, completionHandler: { responseData, response, error in
if error == nil {
let jsonData = try? JSONSerialization.jsonObject(with: responseData!, options: .allowFragments)
if let json = jsonData as? [String: Any] {
print(json)
}
}
}).resume()
}
如果要添加任何标头,则可以通过urlRequest.setValue
方法添加标头。
答案 2 :(得分:2)
原帖:
upload image to server using Alamofire
Ekta Padaliya回答
使用AlamoFire上传图片
1。安装指南请遵循教程
https://github.com/Alamofire/Alamofire
使用的语言 Swift 4
2.导入AlamoFire库
import Alamofire
3。创建自定义方法。
(可以将其粘贴到UIViewController Extension /您的UIViewcontroller中作为新函数)
func uploadImage(img: UIImage){
let ImageData = UIImagePNGRepresentation(img)
let urlReq = "http://apiUrl.php"
let parameters = ["user_id": "useridValue"]//you can comment this if not needed
Alamofire.upload(multipartFormData: { multipartFormData in
multipartFormData.append(ImageData!, withName: "shop_logo",fileName: "file.jpg", mimeType: "image/jpg")
for (key, value) in parameters {// this will loop the 'parameters' value, you can comment this if not needed
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
},
to:urlReq)
{ (result) in
switch result {
case .success(let upload, _, _):
upload.uploadProgress(closure: { (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
})
upload.responseJSON { response in
print(response.result.value)
if let dic = response.result.value as? NSDictionary{
//do your action base on Api Return failed/success
}
}
case .failure(let encodingError):
print(encodingError)
}
}
}
调用这样的方法
self.uploadImage(img:image)