Carga de imágenes de Alamofire con PUT

Actualmente estoy intentando upload una image a Amazon con la url pre-firmada.

La forma en que funciona es que hago una request GET para get la URL previamente firmada y que una request PUT para cargar la image usando la url devuelta de la request GET.

Las dos reglas son: el tipo de contenido debe ser image \ jpeg y los methods http deben ser PUT.

Entonces, actualmente mi código de carga devuelve 200 pero amazon rechaza los datos.

Aquí está mi código:

La URL real devuelta para la carga es: https://mimik-apps-channel.s3-us-west-2.amazonaws.com/profiles/2312528782074206653.jpg?X-Amz-Expires=3600&X-Amz-Algorithm=AWS4 -HMAC-SHA256 y X-Amz-Cnetworkingential = AKIAJ36SCZW7WGBAW7CQ / 20170202 / us-west-2 / s3 / aws4_request & X-Amz-Date = 20170202T102202Z & X-Amz-SignedHeaders = host & X-Amz-Signature = 007ad8694fe1ed83b08d4890f17b9985e169f7ab8fcd7b0d648a383c69ebc748

var headers = Alamofire.SessionManager.defaultHTTPHeaders headers["Content-Type"] = "image/jpeg" let URL = try! URLRequest(url: url, method: .put, headers: headers) Alamofire.upload(multipartFormData: { (multipartFormData) in let compressionQuality: CGFloat = 0.8 guard let imageData = UIImageJPEGRepresentation(image, compressionQuality) else { print("Unable to get JPEG representation for image \(image)") return } multipartFormData.append(imageData, withName: "image.jpg", mimeType: "image/jpeg") // code }, with: URL, encodingCompletion: { (result) in switch result { case .success(let upload, _, _): upload.responseJSON { response in print("SUCCESS -> \(response.request?.allHTTPHeaderFields)") } case .failure(let encodingError): print(encodingError) } }) 

Sospecho que cuando imprimo los encabezados http, Content-Type siempre muestra multipart / form-data y no la image / jpeg que necesito, pero actualmente estoy perdido en qué hacer para resolver esto.

En realidad, recientemente tuve los mismos requisitos (excepto que necesitaba PNG en lugar de JPG).

Así es como lo haces.

 let compressionQuality: CGFloat = 0.8 guard let imageData = UIImageJPEGRepresentation(image, compressionQuality) else { print("Unable to get JPEG representation for image \(image)") return } let headers = [ "Content-Type": "image/jpeg" ] // presignedUrl is a String Alamofire.upload(imageData, to: presignedUrl, method: .put, headers: headers) .responseData { response in guard let httpResponse = response.response else { print("Something went wrong uploading") return } let publicUrl = presignedUrl.components(separatedBy: "?")[0] } 

¿Ha cambiado sus capacidades para permitir services en segundo plano?

introduzca la descripción de la imagen aquí

Algo que me funcionó:

  let imageData = UIImageJPEGRepresentation(image , 0.7) Alamofire.upload(imageData!, to: url, method: .put, headers: nil).responseJSON(completionHandler: { (response) in debugPrint(response) })