Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save TheWorstProgrammerEver/b31ea18283caafca75ce2e12761595eb to your computer and use it in GitHub Desktop.
Save TheWorstProgrammerEver/b31ea18283caafca75ce2e12761595eb to your computer and use it in GitHub Desktop.
Swift URLRequest Multipart Form-Data
import Foundation
import UIKit
extension URLRequest {
typealias BuilderFunction = ((MultipartFormDataInclusion) -> Void) -> Void
struct MultipartFormDataInclusion {
var data: Data
var name: String
var fileName: String
var contentType: String
}
mutating func addMultipartFormData(_ builder: BuilderFunction) {
let boundary = UUID().uuidString
let lineBreak = "\r\n"
setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let body: NSMutableData = .init()
builder { inclusion in
body.append("--\(boundary)")
body.append(lineBreak)
body.append("Content-Disposition: form-data; name=\"\(inclusion.name)\"; filename=\"\(inclusion.fileName)\"")
body.append(lineBreak)
body.append("Content-Type: \(inclusion.contentType)")
body.append(lineBreak)
body.append(lineBreak)
body.append(inclusion.data)
body.append(lineBreak)
body.append("--\(boundary)--")
body.append(lineBreak)
}
httpBody = body as Data
}
}
fileprivate extension NSMutableData {
func append(_ string: String) {
append(string.data(using: .utf8)!)
}
}
let red10x10 = Data(base64Encoded: "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFUlEQVR42mP8z8AARIQB46hC+ioEAGX8E/cKr6qsAAAAAElFTkSuQmCC")!
let green10x10 = Data(base64Encoded: "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFElEQVR42mNk+A+ERADGUYX0VQgAXAYT9xTSUocAAAAASUVORK5CYII=")!
let blue10x10 = Data(base64Encoded: "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFUlEQVR42mNkYJD8z0AEYBxVSF+FAIKSCvtG3YaKAAAAAElFTkSuQmCC")!
var request = URLRequest(url: .init(string: "https://example.com")!)
request.httpMethod = "POST"
request.addMultipartFormData { include in
include(.init(data: red10x10, name: "red", fileName: "red.png", contentType: "image/png"))
include(.init(data: green10x10, name: "green", fileName: "green.png", contentType: "image/png"))
include(.init(data: blue10x10, name: "blue", fileName: "blue.png", contentType: "image/png"))
}
URLSession
.shared
.dataTask(with: request)
.resume()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment