Last active
January 5, 2019 09:56
-
-
Save AshvinGudaliya/9a458de96c4efda4286491c4d2c0ce24 to your computer and use it in GitHub Desktop.
Multipart file/Images upload with parameters in Swift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// AGUploadImageWebServices.swift | |
// BaseProject | |
// | |
// Created by AshvinGudaliya on 27/02/18. | |
// Copyright © 2018 AshvinGudaliya. All rights reserved. | |
// | |
import UIKit | |
struct AGImageStructInfo { | |
var fileName: String | |
var type: String | |
var data: Data | |
} | |
class AGUploadImageWebServices { | |
private let boundary = "Boundary-\(NSUUID().uuidString)" | |
private var request: URLRequest? | |
init(url: String, parameter param : [String: Any]) { | |
guard let url = URL(string: url) else { return } | |
request = URLRequest(url: url) | |
request.httpMethod = "POST" | |
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") | |
request.httpBody = createBody(with: param, boundary: boundary) | |
} | |
func responseJSON(completionHandler: @escaping ([String: Any]?, Error?) -> ()) { | |
guard let request = request else { return } | |
let task = URLSession.shared.dataTask(with: request) { data, response, error in | |
guard let data = data, error == nil else { | |
debugPrint("System error:- \(String(describing: error))") | |
completionHandler(nil, error) | |
return | |
} | |
let responseString = String(data: data, encoding: .utf8) | |
print("responseString = \(String(describing: responseString))") | |
DispatchQueue.main.async { | |
do { | |
let dicResponse = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] | |
print("Response Dict:- \(String(describing: dicResponse))") | |
completionHandler(dicResponse, nil) | |
} catch { | |
completionHandler(nil, error) | |
print("Response Error:- \(String(describing: error))") | |
} | |
} | |
} | |
task.resume() | |
} | |
internal func createBody(with parameters: [String: Any], boundary: String) -> Data { | |
var body = Data() | |
for (key, value) in parameters { | |
if let imageInfo = value as? AGImageStructInfo { | |
body.append("--\(boundary)\r\n") | |
body.append("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(imageInfo.fileName)\"\r\n") | |
body.append("Content-Type: \(imageInfo.type)\r\n\r\n") | |
body.append(imageInfo.data) | |
body.append("\r\n") | |
} | |
else if let imageInfo = value as? [AGImageStructInfo] { | |
for image in imageInfo { | |
body.append("--\(boundary)\r\n") | |
body.append("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(image.fileName)\"\r\n") | |
body.append("Content-Type: \(image.type)\r\n\r\n") | |
body.append(image.data) | |
body.append("\r\n") | |
} | |
} | |
else{ | |
body.append("--\(boundary)\r\n") | |
body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") | |
body.append("\(value)\r\n") | |
} | |
} | |
body.append("--\(boundary)--\r\n") | |
return body | |
} | |
} | |
extension UIImage { | |
func toData() -> Data{ | |
return UIImageJPEGRepresentation(self, 0.7)! as Data | |
} | |
} | |
extension Data { | |
mutating func append(_ string: String) { | |
if let data = string.data(using: .utf8) { | |
append(data) | |
} | |
} | |
} |
How to upload multiple images using this?
@reenaphilip you can now upload multiple images using this.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Import below tow lines on starting of code otherwise it's giving error of undeclared variables. I import this tow lines and errors gone.
import Foundation
import UIKit
Thank You