Skip to content

Instantly share code, notes, and snippets.

@StanDimitroff
Created April 23, 2018 13:50
Show Gist options
  • Save StanDimitroff/a91c31558a946faca4ce6f2abafdd6c2 to your computer and use it in GitHub Desktop.
Save StanDimitroff/a91c31558a946faca4ce6f2abafdd6c2 to your computer and use it in GitHub Desktop.
struct MultipartRequest {
private let boundary = UUID().uuidString
private var bodyString: String = ""
private var body = Data()
var request: URLRequest
init(
url: URL,
params: [String: Any],
imageFiles: [String: NewImage]?,
documentFiles: [String: NewDocument]?
) {
let userAgent = "\(Bundle.applicationName)/\(Bundle.applicationVersionNumber); iOS/\(UIDevice.current.systemVersion))"
request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.setValue(userAgent, forHTTPHeaderField: "User-Agent")
buildBodyString(forParams: params)
if let images = imageFiles { addImageFiles(images) }
if let documents = documentFiles { addDocumentFiles(documents) }
body.append("\r\n--\(boundary)--\r\n".data(using: String.Encoding.utf8, allowLossyConversion: false)!)
request.httpBody = body
}
private mutating func buildBodyString(forParams params: [String: Any]) {
bodyString += "--\(boundary)\n"
bodyString += "Content-Disposition: form-data; name=\"api_key\"\r\n\r\n"
bodyString += "\(RTAPIKey)\n"
bodyString += "--\(boundary)\n"
bodyString += "Content-Disposition: form-data; name=\"auth_key\"\r\n\r\n"
bodyString += "\(Preferences.authKey)\n"
for (key, value) in params {
bodyString += "--\(boundary)\n"
bodyString += "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n"
bodyString += "\(value)\n"
}
body.append(bodyString.data(using: String.Encoding.utf8, allowLossyConversion: false)!)
print(bodyString)
}
private mutating func addImageFiles(_ files: [String: NewImage]) {
for (key, value) in files {
body.append("--\(boundary)\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(value.fileName)\"\n".data(using: String.Encoding.utf8)!)
body.append("Content-Type: \(value.mimeType)\r\n\r\n".data(using: String.Encoding.utf8)!)
let fileExtension = ImageFileExtension(rawValue: value.fileExtension)
switch fileExtension! {
case .PNG: body.append(UIImagePNGRepresentation(value.image.resized)!)
case .JPEG, .JPG, .HEIC: body.append(UIImageJPEGRepresentation(value.image.resized, GlobalConstants.imageQuality)!)
body.append("\r\n".data(using: String.Encoding.utf8)!)
}
}
}
private mutating func addDocumentFiles(_ files: [String: NewDocument]) {
for (key, value) in files {
body.append("--\(boundary)\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition: form-data; name=\"\(key))\"; filename=\"\(value.fileName)\"\n".data(using: String.Encoding.utf8)!)
body.append("Content-Type: \(value.mimeType)\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append(try! Data(contentsOf: value.document.fileURL))
body.append("\r\n".data(using: String.Encoding.utf8)!)
}
}
}
@croccio
Copy link

croccio commented Oct 17, 2018

what classes are "NewDocument" and "NewImage"?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment