I am trying to upload multiple images from an array via multipart/form data using the code below.
func uploadImage<T>(resource: Resource<T>, paramName: String, fileName: [String], images: [PLMUploadImage], completionHandler: @escaping (Result<T, PLMError>) -> Void) {
let boundary = UUID().uuidString
var urlRequest = URLRequest(url: resource.url)
urlRequest.httpMethod = "POST"
urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
if let accessToken = resource.accessToken {
urlRequest.setValue( "\(PLMLOGINAPICONSTANT.BEARER)\(accessToken)", forHTTPHeaderField: PLMLOGINAPICONSTANT.AUTHORIZATION)
}
var data = Data()
for (index, img) in images.enumerated() {
data.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
let fileName = "\(index)" + ".jpg"
data.append("Content-Disposition: form-data; name=\"\(paramName)\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!)
data.append("Content-Type: image/png\r\n\r\n".data(using: .utf8)!)
data.append(img.image.jpeg(.medium)!)
data.append("\r\n--\(boundary)--".data(using: .utf8)!)
}
let session = URLSession.shared
session.uploadTask(with: urlRequest, from: data, completionHandler: { responseData, response, error in
if error == nil {
let jsonData = try? JSONSerialization.jsonObject(with: responseData!, options: .allowFragments)
if let json = jsonData as? [String: Any] {
PLMLogger.prettyPrint(data:json)
let result = try? JSONDecoder().decode(T.self, from: responseData!)
if let result = result {
DispatchQueue.main.async {
completionHandler(.success(result))
}
} else {
DispatchQueue.main.async {
completionHandler(.failure(.decodingError))
}
}
}
}
}).resume()
}
As you see from the above code, only the last image from the array gets uploaded.
The web API is capable of receiving multiple images.