Skip to content

Instantly share code, notes, and snippets.

@AshvinGudaliya
Last active January 5, 2019 09:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AshvinGudaliya/9a458de96c4efda4286491c4d2c0ce24 to your computer and use it in GitHub Desktop.
Save AshvinGudaliya/9a458de96c4efda4286491c4d2c0ce24 to your computer and use it in GitHub Desktop.
Multipart file/Images upload with parameters in Swift
//
// 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)
}
}
}
@AshvinGudaliya
Copy link
Author

AshvinGudaliya commented Mar 8, 2018

You can call Like

let parameters: [String: Any] = [
    "Images": [AGImageStructInfo(fileName: "file1.jpeg", type: "image/jpeg", data: UIImage(named: "Image123")!.toData()), AGImageStructInfo(fileName: "file1.jpeg", type: "image/jpeg", data: UIImage(named: "Image123")!.toData())]
]

AGUploadImageWebServices(url: "https://url", parameter: parameters)
    .responseJSON { (json, eror) in
    
    debugPrint(json)
}

@sanjeevpant
Copy link

sanjeevpant commented Apr 18, 2018

In initialiser the argument type of parameter should be [String:Any].
And you have request as private and in initialiser you have create a new variable request

@Bhavsang
Copy link

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

@reenaphilip
Copy link

How to upload multiple images using this?

@AshvinGudaliya
Copy link
Author

@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