前言
在最近做項目的時候需要向服務(wù)器傳輸圖片數(shù)據(jù),網(wǎng)上找的都是使用NSURLSession
中的upload
方法,無奈始終報錯.后面通過抓服務(wù)器的提供的demo的時候發(fā)現(xiàn)傳輸方式并不是普通POST傳輸方式,特寫此文做一個記錄.
multipart/form-data
首先來介紹下multipart/form-data
協(xié)議,這是HTTP的一種協(xié)議,它的基礎(chǔ)方法是POST請求,但它與普通的POST請求不同在于請求頭,請求體.
在multipart/form-data
協(xié)議中,請求頭必須包含一個特殊的頭信息:Content-Type
并且它的值必須規(guī)定為multipart/form-data
,不僅如此還需要規(guī)定一個內(nèi)容用于分割請求體中的多個POST內(nèi)容,那么這個構(gòu)造方式大致的樣式如下:
//開始
--boundary
//文件信息
Content-Disposition:form-data;name="file";filename="img.jpeg"
//文件格式
Content-Type;image/jpeg
//文件內(nèi)容
imageData
//結(jié)束
--boundary--
其中boundary
就是之前所說的用于分割多個POST內(nèi)容的內(nèi)容,整個構(gòu)造以--boundary
開始,--boundary--
結(jié)束(boundary
不能為中文)障癌。
介紹完這個以后下面來拼接,其中我設(shè)置boundary
為demoTest
:
// 創(chuàng)建可拼接NSMutableData對象
NSMutableData *requestMutableData=[NSMutableData data];
//1.拼接 --demoTest
NSMutableString *myString=[NSMutableString stringWithFormat:@"--demoTest\r\n"];
//2.拼接Content-Disposition:form-data;name="file";filename="img.jpeg"
[myString appendString:[NSString stringWithFormat:@"Content-Disposition:form-data;name=\"file\";filename=\"img.jpeg\" \r\n"]];
//3. Content-Type:image/jpeg \r\n // 圖片類型為jpeg
[myString appendString:[NSString stringWithFormat:@"Content-Type:image/png\r\n"]];
//轉(zhuǎn)換成為二進(jìn)制數(shù)據(jù)
[requestMutableData appendData:[myString dataUsingEncoding:NSUTF8StringEncoding]];
[requestMutableData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//4.文件數(shù)據(jù)部分
[requestMutableData appendData:imageData];
[requestMutableData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//5. --demoTest--
[requestMutableData appendData:[[NSString stringWithFormat:@"--demoTest--"] dataUsingEncoding:NSUTF8StringEncoding]];
// 設(shè)置請求頭格式為Content-Type:multipart/form-data; boundary=demoTest
[request setValue:@"multipart/form-data; boundary=demoTest" forHTTPHeaderField:@"Content-Type"];
request.HTTPBody = requestMutableData;
其中\r\n
為回車換行,Content-disposition
是MIME協(xié)議的擴(kuò)展彼城,MIME協(xié)議指示MIME用戶代理如何顯示附加的文件综慎。
在使用原生的圖片傳輸?shù)臅r候我們需要去拼接這個這個表單,在我們使用AFNetworking
的話玩去不需要去做這些拼接,再下一篇文章會解析下AFNetworking
中是如何拼接的.