使用Alamofire和multipart / form-data

我无法正确处理已经提供给我的API,因为它给了我正在寻找的响应。 我一直在使用Swift和Alamofire,但是这是我第一次使用multipart / form-data来上传图片。 我可以使用邮差上传图片,但我无法得到我的应用程序使用Alamofire框架发出的相同的消息。

我的邮递员截图

我的Swift代码:

func postFulfilWish(wish_id: Int, picture : UIImage, completionHandler: ((AnyObject?, ErrorType?) -> Void)) { var urlPostFulfilWish = Constant.apiUrl; urlPostFulfilWish += "/wishes/"; urlPostFulfilWish += String(wish_id); urlPostFulfilWish += "/fulfill/images" ; let image : NSData = UIImagePNGRepresentation(UIImage(named: "location.png")!)! Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(data: image, name: "file") }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseJSON { response in //This is where the code ends up now //So it's able to encode my message into multipart/form-data but it's not doing it in the correct way for the API to handle it debugPrint(response) } case .Failure(let encodingError): print(encodingError) } } ) } 

如果还没有回答,最近我有同样的问题使用Alamofire上传图像使用表单数据。

我能够使用Postman上传图像,就像在这篇文章中显示的一样,但是在我的应用程序中没有能够使用Alamofire。

您需要检查两件事情,首先是服务器所期望的文件名,其次是用于在multipartFormData闭包中追加正文部分的方法。

这两种方法在我的情况下不起作用 –

 multipartFormData.appendBodyPart(data: imageData, name: "file") 

这一个既不

 multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: name) 

但在这一个灿烂的工作 –

 multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "file.jpeg", mimeType: "image/jpeg") 

问题基本上是服务器找不到具有预期名称的文件。

我希望这可以帮助别人节省时间,想知道为什么它不工作。

你正在做debugPrint(response) 。 你大概应该做另一个switch response.result { ... } ,看看你是否有.Failure.Failure作为请求的结果,如果成功,你会看响应对象的内容(或者如果失败,看在失败错误)。 你需要看看这个result来诊断它是否成功。

 Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(data: image, name: "file") }) { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseJSON { response in switch response.result { case .Success(let value): print(value) case .Failure(let error): print(error) } } case .Failure(let encodingError): print(encodingError) } } 

我相信这个问题已经过时了,但只要没有答案接受,请尝试以下方法:

 multipartFormData.appendBodyPart(data: imageData, name: "name", fileName: "filename", mimeType: mimeType) 

我最近从服务器发送一个多部分的请求与正文中的参数时,404。 我使用的是一个UIImagePickerController(为其返回一个UIImage的代理),然后我发送了它的PNG表示。

这只发生在磁盘上的JPEG文件。 奇怪的是,这个问题似乎只影响也有正文中的参数的多部分请求。 当API端点不需要其他任何东西的时候,它工作的很好。

我的猜测是,沿着JPEG – > UIImage – > PNG表示方式出现了一些奇怪的现象,导致了一些奇怪的问题,似乎只是在多部分请求中出现,而这些请求在主体中也有参数。 在那里可能是一些特殊的字符,使服务器不能识别请求,只是返回一个404。

我最终通过发送所选图像的UIImageJPEGRepresentation而不是UIImagePNGRepresentation来修复它,并没有这样的错误。