Alamofire – 使用照片时图像上传失败

亲爱的stackoverflow社区,

我正在使用Alamofire将JSON和图像发送到REST API的iOS应用程序中工作。 图像被图像select器检索并存储在一个数组中。 问题是,只要我使用从互联网上下载的图像等图像上传工作。一旦我尝试上传照片,这是我正在使用的手机(从照片库中select)拍摄的上传失败并抛出一个400 – 错误的请求错误。 奇怪的是,当我可以上传照片,这是从另一个iPhone采取的,但被发送给我,但照片,这是用手机本身没有工作…是否有人有一个想法,为什么这个问题发生? 我有一个怀疑,iPhone的照片格式或数据可能不同于下载的,由于HDR和其他的东西,但我不知道这是否是问题。

下面是我使用的代码,它的标准很漂亮:

func POST_WITH_ATACHMENTS(description: String, attachments: [UIImage], returnCompletion: @escaping (Bool) -> ()) { let parameters = ["ticket":"{ \"description\" : \"" + description + "\"}"] APIManager.Manager.upload(multipartFormData: { multipartFormData in for (key, value) in parameters { multipartFormData.append((value.data(using: .utf8)!), withName: key, mimeType: "application/json") } var counter = 1 for image in attachments { multipartFormData.append(UIImagePNGRepresentation(image)!, withName: "attachments", fileName: "attachment" + String(counter) + ".png", mimeType: "image/png") counter += 1 } }, to: restURL!, method: .post, headers:["Authorization" : loginString], encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload.responseJSON { response in debugPrint(response) if (upload.response?.statusCode == 201) { returnCompletion(true) } else { returnCompletion(false) } } case .failure(let encodingError): print(encodingError) returnCompletion(false) } }) } 

这里是使用AlamoFire上传图片的web服务

 class WebServiceHandler: AnyObject { func uploadWithAlamofire(Parameters params : [NSObject : AnyObject]?,ImageParameters imgparams : [NSObject : AnyObject]?,Action action : NSString, success: @escaping (AnyObject) -> Void, failure: @escaping (AnyObject) -> Void) { var base_url = "YOUR BASE_URL" base_url.append(action as String) Alamofire.upload(multipartFormData: { multipartFormData in if imgparams != nil{ for (key, value) in imgparams! { if let imageData = UIImageJPEGRepresentation(value as! UIImage, 1) { multipartFormData.append(imageData, withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000)).jpg", mimeType: "image/jpg") } } } if params != nil { for (key, value) in params! { multipartFormData.append((value as! String).data(using: .utf8)!, withName: key as! String) } } }, to: base_url, method: .post, headers: nil, encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload.uploadProgress { progress in print(progress.fractionCompleted) } upload.response { [weak self] response in guard self != nil else { return } let responseString = String(data: response.data!, encoding: String.Encoding.utf8) return success(responseString as AnyObject) } case .failure(let encodingError): print("error:\(encodingError)") return failure(encodingError as AnyObject) } }) } func convertToDictionary(text: String) -> [String: Any]? { if let data = text.data(using: .utf8) { do { return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] } catch { print(error.localizedDescription) } } return nil } } ----------------------------USAGE----------------------------- let dict_params = NSMutableDictionary() dict_params.set("123", forKey:"YourKey") dict_params.set("123", forKey:"YourKey") . . .and so on let imgparam = NSMutableDictionary() imgparam.set(YourImagetoUpload, forKey: "YourKey") //here YourImagetoUpload is like imageview.image or UIImage(named: "123.png") imgparam.set(YourImagetoUpload, forKey: "YourKey") . . .and so on self.webservice.uploadWithAlamofire(Parameters: dict_params as [NSObject : AnyObject], ImageParameters: imgparam as [NSObject : AnyObject], Action: "API_ACTION_CALL", success: { (success) in print(success) }) { (error) in print(error) }