iOS 使用Post方法上傳文件或圖片

在iOS開發(fā)中使用POST請求上傳文件分為三步:

1.設(shè)置請求行
NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"<#urlString#>"]];
2.設(shè)置post請求

post請求抽出到NSMutableURLRequest+PostFile.h這個(gè)類中
另外在iOS開發(fā)中對于圖片或者文件的上傳拴竹,Xcode并沒有進(jìn)行封裝蚂踊,所以需要自己手動(dòng)的在代碼中拼接請求體肛响,請求體的格式如下:

請求體格式:
 
 \r\n--Boundary+72D4CD655314C423\r\n   // 分割符耕蝉,以“--”開頭,后面的字隨便寫朋蔫,只要不寫中文即可

 Content-Disposition: form-data; name="uploadFile"; filename="001.png"\r\n  // 這里注明服務(wù)器接收圖片的參數(shù)(類似于接收用戶名的userName)及服務(wù)器上保存圖片的文件名

 Content-Type:image/png \r\n  // 圖片類型為png

 Content-Transfer-Encoding: binary\r\n\r\n  // 編碼方式
 // 這里是空一行靡挥,必不可少!树瞭!
 ... contents of boris.png ...  // 圖片數(shù)據(jù)部分

 \r\n--Boundary+72D4CD655314C423--\r\n  // 分隔符后面以"--"結(jié)尾,表明結(jié)束

其中“\r\n” 表示換行爱谁。

NSMutableURLRequest+PostFile.m文件中實(shí)現(xiàn)封裝的具體代碼如下:
#import "NSMutableURLRequest+PostFile.h"

@implementation NSMutableURLRequest (PostFile)
static NSString *boundary=@"AlvinLeonPostRequest";

+(instancetype)requestWithURL:(NSURL *)url andFilenName:(NSString *)fileName andLocalFilePath:(NSString *)localFilePath{

    //post請求
    
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:2.0f];
    request.HTTPMethod=@"POST";//設(shè)置請求方法是POST
    request.timeoutInterval=15.0;//設(shè)置請求超時(shí)
    
    //拼接請求體數(shù)據(jù)(1-6步)
    NSMutableData *requestMutableData=[NSMutableData data];
    /*--------------------------------------------------------------------------*/
    //1.\r\n--Boundary+72D4CD655314C423\r\n   // 分割符晒喷,以“--”開頭,后面的字隨便寫访敌,只要不寫中文即可
    NSMutableString *myString=[NSMutableString stringWithFormat:@"\r\n--%@\r\n",boundary];
    
    //2. Content-Disposition: form-data; name="uploadFile"; filename="001.png"\r\n  // 這里注明服務(wù)器接收圖片的參數(shù)(類似于接收用戶名的userName)及服務(wù)器上保存圖片的文件名
    [myString appendString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uploadFile\"; filename=\"%@\"\r\n",fileName]];
    
    //3. Content-Type:image/png \r\n  // 圖片類型為png
    [myString appendString:[NSString stringWithFormat:@"Content-Type:application/octet-stream\r\n"]];
    
    //4. Content-Transfer-Encoding: binary\r\n\r\n  // 編碼方式
    [myString appendString:@"Content-Transfer-Encoding: binary\r\n\r\n"];
    
    //轉(zhuǎn)換成為二進(jìn)制數(shù)據(jù)
    [requestMutableData appendData:[myString dataUsingEncoding:NSUTF8StringEncoding]];

    //5.文件數(shù)據(jù)部分
    NSURL *filePathUrl=[NSURL URLWithString:localFilePath];
    
    //轉(zhuǎn)換成為二進(jìn)制數(shù)據(jù)
    [requestMutableData appendData:[NSData dataWithContentsOfURL:filePathUrl]];
    
    //6. \r\n--Boundary+72D4CD655314C423--\r\n  // 分隔符后面以"--"結(jié)尾凉敲,表明結(jié)束
    [requestMutableData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    /*--------------------------------------------------------------------------*/
    //設(shè)置請求體
    request.HTTPBody=requestMutableData;
    
    //設(shè)置請求頭
    NSString *headStr=[NSString stringWithFormat:@"Content-Type multipart/form-data; boundary=%@",boundary];
    [request setValue:headStr forHTTPHeaderField:@"Content-Type"];

    return request;
}

在NSMutableURLRequest+PostFile.m中,拼接完請求體數(shù)據(jù)之后(分割線之間的部分),還需要個(gè)post請求設(shè)置一個(gè)請求頭荡陷。請求頭跟請求體一樣雨效,也有自己固定的格式。
其中setValue: forHTTPHeaderField:方法是用來設(shè)置request的請求頭,其返回值是void废赞。
具體的格式如下:

/* *****請求頭格式*****
 Content-Length(文件大小)
 Content-Type  multipart/form-data; boundary(分隔符)=(可以隨便寫但不能有中文)
  */

 NSString *headStr=[NSString stringWithFormat:@"Content-Type multipart/form-data; boundary=%@",boundary];
 [request setValue:headStr forHTTPHeaderField:@"Content-Type"];
 
3.設(shè)置連接方式

在Xcode 7.1以后推薦使用NSURLSession,來替代NSURLConection

    /* *****替代NSURLConection的NSURLSesstion方法*****
     
     Xcode中已經(jīng)不推薦使用NSURLConection叮姑,開始用NSURLSesstion來替代唉地。
     
     + (void)sendAsynchronousRequest:(NSURLRequest*) request
     queue:(NSOperationQueue*) queue
     completionHandler:(void (^)(NSURLResponse* __nullable response, NSData* __nullable data, NSError* __nullable connectionError)) handler NS_DEPRECATED(10_7, 10_11, 5_0, 9_0, "Use [NSURLSession dataTaskWithRequest:completionHandler:] (see NSURLSession.h");
     */

NSURLSession *session=[NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        id result=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"post==%@",result);

    }];
    [dataTask resume];

ViewController中調(diào)用的方法如下:

#import "ViewController.h"
#import "NSMutableURLRequest+PostFile.h"

@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor=[UIColor whiteColor];
    [self PostFile];//調(diào)用POST請求
}
-(void)PostFile{
    
    //用post上傳文件
    
    //url
    NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"<#urlString#>"]];

    //post請求
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url andFilenName:@"Alvin.data" andLocalFilePath:[[NSBundle mainBundle]pathForResource:@"Alvin.png" ofType:nil]];

    //連接(NSURLSession)    
    NSURLSession *session=[NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        id result=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"post==%@",result);
        
    }];
    [dataTask resume];
}
@end
QQ20151022-7@2x.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市传透,隨后出現(xiàn)的幾起案子耘沼,更是在濱河造成了極大的恐慌,老刑警劉巖朱盐,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件群嗤,死亡現(xiàn)場離奇詭異,居然都是意外死亡兵琳,警方通過查閱死者的電腦和手機(jī)狂秘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躯肌,“玉大人者春,你說我怎么就攤上這事∏迮” “怎么了钱烟?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫡丙。 經(jīng)常有香客問我拴袭,道長,這世上最難降的妖魔是什么曙博? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任拥刻,我火速辦了婚禮,結(jié)果婚禮上羊瘩,老公的妹妹穿的比我還像新娘泰佳。我一直安慰自己,他們只是感情好尘吗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布逝她。 她就那樣靜靜地躺著,像睡著了一般睬捶。 火紅的嫁衣襯著肌膚如雪黔宛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天擒贸,我揣著相機(jī)與錄音臀晃,去河邊找鬼觉渴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徽惋,可吹牛的內(nèi)容都是我干的案淋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼险绘,長吁一口氣:“原來是場噩夢啊……” “哼踢京!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宦棺,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤瓣距,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后代咸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹈丸,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年呐芥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逻杖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贩耐,死狀恐怖弧腥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潮太,我是刑警寧澤管搪,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站铡买,受9級特大地震影響更鲁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奇钞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一澡为、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧景埃,春花似錦媒至、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至完慧,卻和暖如春谋旦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工册着, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拴孤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓甲捏,卻偏偏與公主長得像演熟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子司顿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容