使用Alamofire和multipart / form-data

时间:2016-03-17 02:46:30

标签: ios iphone swift multipartform-data alamofire

我无法以适当的方式接触以我提供给我的响应的API,以便我能够找到我想要的响应。我已经使用Swift和Alamofire一段时间,但这是我第一次使用multipart / form-data上传图像。我可以使用Postman上传图片,但我无法通过我的应用程序使用Alamofire框架发送相同的消息。

My Postman screenshot

我的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)
            }
        }
    )
}

4 个答案:

答案 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)