2015-10-14 33 views
4

來自網絡編程的世界,我非常適合使用多部分表單請求來上傳文件。但是,在iOS中,我們有一個名爲NSURLSession的方法,其方法爲uploadTaskWithRequest,這似乎是調用圖像上傳等的方法。多部分表單上傳和NSURLSession.uploadTaskWithRequest之間的區別

你能解釋一下兩種方法的區別,multipart form upload vs uploadTaskWithRequest?如果我已經擁有處理多部分表單上傳的後端,那麼我可能需要什麼樣的調整以便它也支持uploadTaskWithRequest

回答

10

uploadTaskWithRequest只是將NSData,文件或流作爲請求的主體發送。除此之外,它什麼都不做。它只是具有可以與後臺會話一起使用的好處。因此,如果您的網絡服務期待multipart/form-data請求,您必須自己構建該請求(除非您使用類似AFNetworking或Alamofire的方法爲您執行此操作)。一旦你建立了這個請求,你可以使用dataTaskWithRequest(設置NSMutableURLRequestHTTPBody)或uploadTaskWithRequest(在這種情況下,你沒有設置HTTPBody,而是將它作爲參數提供給uploadTaskWithRequest)。

順便說一句,像Charles這樣的工具在這些情況下非常有用,讓你觀察幕後發生了什麼。

+0

Rob,我試圖用'uploadTaskWithRequest'創建'multipart/form-data'。我如何提供身體作爲參數? – jaumevn

+3

您首先必須構建多部分主體(http://stackoverflow.com/a/26163136/1271826或http://stackoverflow.com/a/24252378/1271826),然後將其作爲'data'參數提供給'uploadTaskWithRequest'。或者,如果您正嘗試使用後臺會話(不允許使用「NSData」重演)執行此操作,則可以將該多部分數據保存爲文件,然後將該文件作爲參數提供給'uploadTaskWithRequest'。 – Rob

+0

感謝羅布。我通過使用'NSURLSessionDataTask'和'dataTaskWithRequest'方法解決了這個問題。 :) – jaumevn

2

文件上傳與multipart/form-data

使用multipart/form-data內容類型,第一種方法是最初在RFC 1867定義,然後轉移到萬維網聯盟,其中包括它在規範HTML 4.0,其中形式用HTML表示,並通過HTTP和電子郵件發送表單值。當表格被用戶填寫後,表單被髮送到服務器。這種技術得到了瀏覽器和Web服務器的廣泛支持和使用。

但是multipart/form-data也可以用來定義表單數據,這些表單數據以HTML以外的其他表示形式呈現。也就是說,您不一定需要Web瀏覽器或Web服務器。目前的規範可以被廣泛的應用程序使用,並通過各種協議傳輸,它們是RFC 7578(形式IETF)。

但必須提及的是,multipart/form-data內容類型並非總是/不是沒有問題。它本身相當複雜。此外,它還使用/引用了很多其他的RFC,並且 - 由於清除了它 - 它和它所依賴的那些已經被更改,廢棄和更新頻繁。由於其複雜性,序列化程序和解析器也變得相當複雜,並且存在大量的錯誤和其他問題的空間。

NSURLSession uploadTaskWithRequest

如何NSURLSession組成的請求沒有被精確記錄。不過,它當然不會使用內容類型multipart/form-data

對於上傳任務,NSURLSession使用帶有NSURLRequest作爲參數的POST請求,您可以自行設置。也就是說,您可以選擇設置內容類型(例如text/plain; charset=utf-8)和其他標題,NSURLSession也可以從給定的內容(文件,流或NSData)派生適當的內容類型本身。也就是說,它可以成爲一個「簡單」的POST請求由於複雜度較低,請求不那麼麻煩

因此,爲了讓您的服務器支持應該上傳文件的uploadTaskWithRequest,它應該簡單地支持帶有一些「簡單「內容類型,也就是說,與內容類型爲multipart/form-data的」文件上傳「相反,該類型在處理頭中包含文件名,服務器需要返回資源(文件)所在位置的URL寫入。

相關問題