AFNetworking 2.0将参数和图像发送到服务器

时间:2014-12-22 04:08:27

标签: ios swift afnetworking-2

我正在使用AFNetworking2将参数和图片发送到服务器。

    manager.POST(urlPath, parameters: parameters, constructingBodyWithBlock: { (formData: AFMultipartFormData!) -> Void in
            formData.appendPartWithFileData(imageData!, name: "image", fileName: "dummy.jpg", mimeType: "image/jpeg")
        }, success: { (dataTask: NSURLSessionDataTask!, responseObject: AnyObject!) -> Void in
            println("success: \(responseObject.description)")

        }, failure: { (dataTask: NSURLSessionDataTask!, error: NSError!) -> Void in
            println("failure: \(error)")
    })


在服务器端,数据将dictionary合并parameters(QueryDict)和图片data(MultiValueDict)

data=MergeDict(<QueryDict: {u'owner': [u'6'], u'description': [u'this
is p1'], u'name': [u'p1']}>, <MultiValueDict: {u'image':
[<InMemoryUploadedFile: file.jpg (image/jpeg)>]}>)


我估算了MultiValueDict&#39;来自这部分代码:
 formData.appendPartWithFileData(imageData!, name: "image", fileName: "dummy.jpg", mimeType: "image/jpeg")

但是,我希望MultiValueDict像这样: {u'groupImages': [{u'image': [<InMemoryUploadedFile: file.jpg (image/jpeg)>]}]}

数据格式是带有数组值的Dictionary,数组有另一个Dictionary值。

那么我该怎样做才能使formData.appendPartWithFileData变成上述数据格式?


修改

我看过一些与我的问题类似的帖子。 例如,这一个:AFNetworking post image in nested json

我试图改变我的代码:

formData.appendPartWithFileData(imageData!, name: "groupImages[0].image", fileName: "dummy.jpg", mimeType: "image/jpeg")

formData.appendPartWithFileData(imageData!, name: "groupImages[0][image]", fileName: "dummy.jpg", mimeType: "image/jpeg")

但他们都没有为我工作。

我的服务器希望收到这样的JSON:

{
    "name": "p2",
    "owner": 6,
    "description": "this is p2",
    "groupImages": [{
        "image": <InMemoryUploadedFile: dummy.jpg (image/jpeg)>
    }]
} 

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

当您发送 multipart HTTP请求时,JSON数据和图像数据是分开的 - 实际上是多个部分。可能值得一看this answer to "What is HTTP Multipart Request",以便您可以看到数据的传输方式。

它的长短是JSON和图像合并到服务器端的字典中。图像不会嵌入JSON中。 如何它们的合并语义(例如,如何使用groupImages[0][image]这样的名称与JSON字典合并)由服务器决定,而不是由您的iOS应用程序决定。

因此,您的服务器团队应该能够指定您如何命名此文件,以便它正确地与字典合并。他们应该能够生成一个正常工作的示例HTTP请求(例如,使用curl或Postman)。如果您的服务器有一个Web应用程序,您可以检查Web应用程序中的类似功能,以查看请求在那里的样子。一旦有了工作请求,您可以通过将传出的NSURLRequest与它们提供的样本请求进行比较来模仿它。