我正在使用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)")
})
在服务器端,数据将是由参数(QueryDict)和图像数据(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’来自这部分代码:
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)>
}]
}
任何的想法?
最佳答案 发送多部分HTTP请求时,JSON数据和图像数据是分开的 – 字面上分为多个部分.可能值得一看
this answer to “What is HTTP Multipart Request”,这样您就可以看到数据的传输方式.
它的长短是JSON和图像合并到服务器端的字典中.图像不会嵌入JSON中.它们如何合并的语义(例如,如何使用groupImages [0] [image]如何与JSON字典合并)由服务器决定,而不是由您的iOS应用程序决定.
因此,您的服务器团队应该能够指定您如何命名此文件,以便它正确地与字典合并.他们应该能够生成一个正常工作的示例HTTP请求(例如,使用curl或Postman).如果您的服务器有一个Web应用程序,您可以检查Web应用程序中的类似功能,以查看请求在那里的样子.一旦有了工作请求,就可以通过将传出的NSURLRequest与它们提供的样本请求进行比较来模拟它.