我无法以适当的方式接触以我提供给我的响应的API,以便我能够找到我想要的响应。我已经使用Swift和Alamofire一段时间,但这是我第一次使用multipart / form-data上传图像。我可以使用Postman上传图片,但我无法通过我的应用程序使用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)
}
}
)
}
答案 0 :(得分:7)
如果还没有回答,最近我使用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")
问题基本上是服务器找不到具有预期名称的文件。
我希望这可以帮助别人节省时间,想知道为什么它不起作用。
答案 1 :(得分:1)
我最近在发布多部分请求以及正文中的参数时从服务器获得了404。我正在使用UIImagePickerController(其代理返回一个UIImage),然后我发送了它的PNG表示。
这仅适用于磁盘上为JPEG的文件。奇怪的是,这个问题似乎只会影响身体中也有参数的多部分请求。当API端点不需要任何其他内容时,它工作正常。
我的猜测是沿着JPEG线发生了一些奇怪的事情 - > UIImage - > PNG表示导致某种问题,奇怪的是,它似乎只在身体中也有参数的多部分请求中表现出来。可能是某些特殊字符使服务器无法识别请求并返回404。
我最后通过发送所选图像的UIImageJPEGRepresentation而不是UIImagePNGRepresentation来修复它,并且没有这样的错误。
答案 2 :(得分:0)
你在做debugPrint(response)
。您可能应该执行另一个switch response.result { ... }
并查看请求是否有.Success
或.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)
}
}
答案 3 :(得分:0)
我认为问题已经过时,但只要没有接受答案,请尝试以下方法:
multipartFormData.appendBodyPart(data: imageData, name: "name", fileName: "filename", mimeType: mimeType)