文件上傳與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寫入。
Rob,我試圖用'uploadTaskWithRequest'創建'multipart/form-data'。我如何提供身體作爲參數? – jaumevn
您首先必須構建多部分主體(http://stackoverflow.com/a/26163136/1271826或http://stackoverflow.com/a/24252378/1271826),然後將其作爲'data'參數提供給'uploadTaskWithRequest'。或者,如果您正嘗試使用後臺會話(不允許使用「NSData」重演)執行此操作,則可以將該多部分數據保存爲文件,然後將該文件作爲參數提供給'uploadTaskWithRequest'。 – Rob
感謝羅布。我通過使用'NSURLSessionDataTask'和'dataTaskWithRequest'方法解決了這個問題。 :) – jaumevn