I have a function that is supposed to generate a multipart/form-data body for post requests so that I can send an image along with form parameters.
class HttpService {
// https://stackoverflow.com/questions/26162616/upload-image-with-parameters-in-swift
static func createMultipartBody(parameters: [String: String], boundary: String, data: Data, mimeType: String, filename: String) throws -> Data {
var body = Data()
for (key, value) in parameters {
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")
body.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(filename)\"\r\n")
body.append("Content-Type: \(mimeType)\r\n\r\n")
body.append(data)
body.append("\r\n")
body.append("--\(boundary)--\r\n")
return body
}
}
extension Data {
mutating func append(_ string: String) {
if let data = string.data(using: .utf8) {
append(data)
}
}
}
I use this function like this:
let urlString = baseUrl + "/api/user"
let url = URL(string: urlString)
var urlRequest = URLRequest(url: url!)
urlRequest.httpMethod = "POST"
let boundary = "Boundary-\(UUID().uuidString)"
urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let parameters: [String: String] = ["email": email, "username": username, "password": password]
do {
let multipartBody = try HttpService.createMultipartBody(parameters: parameters, boundary: boundary, data: imageData, mimeType: "image/jpg", filename: "photo.jpg")
urlRequest.httpBody = multipartBody
print(multipartBody)
print(String(data: multipartBody, encoding: String.Encoding.utf8))
} catch let error {
print(error)
return
}
This outputs:
51551 bytes
nil
So it looks like the data is being generated, but I can't output it as string to see how the format looks like.