2014-12-22 44 views
4

我使用AFNetworking2發送參數和圖像到服務器。AFNetworking 2.0發送參數和圖像到服務器

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)") 
    }) 


在服務器端,數據將通過parameters(QueryDict)合併一個dictionary和圖像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' 是:
我想有MultiValueDict是這樣的: {u'groupImages': [{u'image': [<InMemoryUploadedFile: file.jpg (image/jpeg)>]}]}

的數據格式是與陣列值的字典,並且陣列具有另一字典值。

那麼我能做些什麼來使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)> 
    }] 
} 

任何想法?

回答

2

當發送 HTTP請求時,JSON數據和圖像數據是獨立的 - 字面在多個部分。這可能值得看看this answer to "What is HTTP Multipart Request",這樣你就可以看到數據是如何傳輸的。

它的長短之處在於JSON和圖像合併到服務器端的字典中。圖像不會嵌入到JSON中。 的語義如何合併(例如,如何使用名稱groupImages[0][image]與JSON字典進行合併)由服務器決定,而不是由您的iOS應用程序決定。

因此,您的服務器團隊應該能夠指定如何命名該文件,以便它與字典正確合併。他們應該能夠生成正確運行的示例HTTP請求(例如,使用curl或Postman)。如果您的服務器有一個Web應用程序,您可以檢查Web應用程序中的類似功能以查看請求的外觀。一旦你有一個工作請求,你可以通過比較你的傳出NSURLRequest和他們提供的樣本請求來模擬它。

+0

感謝您的回答亞倫。首先,我只想確保在AFNetworking constructBodyWithBlock中代表嵌套JSON {'groupImages':[{'image':#imageData}]'的這種格式'groupImages [0] [image]'是正確的,對吧?在服務器端,我使用Django Rest Framework 3.0。我對雙方都是新的,所以我需要一些時間來找出答案。 – redstone