ios file類型附件上傳(multipart/form-data)

之前做的文件上傳一般都是一次性一個文件循環(huán)提交或者是使用webservice接口提交审丘,這段時間新項目需求變了,需要多附件一次性上傳,而且還說是file類型上傳葛圃。當時沒反應過來默垄,什么是file類型上傳此虑,在上網(wǎng)查了資料看了之后完成需求之后明白了。其實就是咱們常見的表單上傳口锭,使用multipart/form-data格式提交附件數(shù)據(jù)朦前。
表單提交數(shù)據(jù)的時候介杆,默認類型是application/x-www-form-urlencoded,也就是key=value的鍵值對格式韭寸,提交文件的時候使用multipart/from-data春哨。因為是表單提交,所以http請求方式是POST恩伺。然后在請求頭里設(shè)置Content-Type為multipart/from-data指定請求的格式赴背。

post有兩種上傳方式,這里只列舉上傳附件的方式(這種請求方式支持文件或文件&普通參數(shù)或普通參數(shù))即:
Content-Type = multipart/form-data;
該種類型有固定的參數(shù)拼接格式
普通參數(shù)
--boundry\r\n
Content-Disposition: form-data; name="%@"\r\n
\r\n
value
\r\n

文件參數(shù)
--boundry\r\n
Content-Disposition:form-data; name="%@"; filename="%@"\r\nContent-Type: %@\r\n
\r\n
data
\r\n
參數(shù)結(jié)尾
--boundry--\r\n

其中name 即為表單請求字段(服務(wù)端要求的附件數(shù)據(jù)對應的參數(shù)字段),fileName為保存在服務(wù)端的文件名字,Content-Type為文件類型(image/png 或者video/mpeg4等等)晶渠,具體可以查看Content-Type參照表這里我只列一下比較常用的一些:
"com.microsoft.powerpoint.ppt",
"com.microsoft.word.doc",
"com.microsoft.excel.xls",
"com.microsoft.powerpoint.?pptx",
"com.microsoft.word.docx",
"com.microsoft.excel.xlsx",
"public.avi",
"public.3gpp",
"public.mpeg",
"com.compuserve.gif"
"public.jpeg",
"public.png",
"public.plain-text",
"com.adobe.pdf"
"image/png"
"image/jpg"
"image/jpeg"
看對應的后綴就知道文件是什么格式了.
//遍歷數(shù)組 根據(jù)文件類型不同轉(zhuǎn)化為NSData類型放到body里面
/*
_selectPhotoArray 存放圖片 或者附件地址癞尚,然后在提交的時候轉(zhuǎn)化為NSDAta類型 也可以講方法放到下面的body賦值方法里面
*/

[_selectPhotoArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    if ([obj isKindOfClass:[UIImage class]]) {
        NSData * data = UIImageJPEGRepresentation(obj, 1.0f);
        [array addObject:data];
    }else{
        NSData *data = [NSData dataWithContentsOfFile:obj];
        [array addObject:data];
    }
}];

define MSEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]

-(void)sendPost:(NSString)urlStr Paramater:(NSDictionary)para dataArray:(NSArray)dataArray name:(NSString)Name{

NSMutableData *dataM = [NSMutableData data];
/* 普通參數(shù)*/
[para enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL *_Nonnull stop) {
    NSString *boundry = [NSString stringWithFormat:@"--%@\r\n",TEST_FORM_BOUNDARY];
    [dataM appendData:MSEncode(boundry)];
    NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n",key];
    NSLog(@"%@",disposition);
    [dataM appendData:MSEncode(disposition)];
    [dataM appendData:MSEncode(@"\r\n")];
    [dataM appendData:MSEncode(obj)];
    [dataM appendData:MSEncode(@"\r\n")];
}];
/* 文件參數(shù)*/
for (NSData *  data in dataArray) {
    if(data&&data.length>0){
        NSString *fileName = [NSString stringWithFormat:@"image%@.png",[MSFunction getNowTimeTimestamp3]];
        NSString *boundry = [NSString stringWithFormat:@"--%@\r\n",TEST_FORM_BOUNDARY];
        [dataM appendData:MSEncode(boundry)];
        NSString * cotentype = [MSFunction backContent_type:fileName];
        NSString *disposition=[NSString stringWithFormat:@"Content-Disposition:form-data; name=\"%@\"; filename=\"%@\"\r\nContent-Type: %@\r\n\r\n",Name,fileName,cotentype];
        NSLog(@"%@",disposition);
        [dataM appendData:MSEncode(disposition)];
        [dataM appendData:data];
        [dataM appendData:MSEncode(@"\r\n")];
    }
}
//尾部的分隔符
NSString *strBottom = [NSString stringWithFormat:@"--%@--\r\n",TEST_FORM_BOUNDARY];
[dataM appendData:MSEncode(strBottom)];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];
//設(shè)置上傳數(shù)據(jù)的長度及格式
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",TEST_FORM_BOUNDARY]forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)dataM.length]forHTTPHeaderField:@"Content-Length"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:dataM];
//創(chuàng)建會話
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionUploadTask *updataTask = [session uploadTaskWithRequest:request fromData:dataM completionHandler:^(NSData *_Nullable data,NSURLResponse *_Nullable response, NSError * _Nullable error) {
    if (!error) {
        NSLog(@"response:%@",response);
        NSDictionary *dicJson=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        if (self.waitMB){
            [MSFunction closeHUD:self.waitMB];
            self.waitMB=nil;
        }
        if ([[dicJson objectForKey:@"ok"] isEqualToString:@"true"]) {
            [MSFunction openIntervalHUD:[dicJson objectForKey:@"Message"]];
        }else{
            [MSFunction openIntervalHUD:[dicJson objectForKey:@"errorMessage"]];
        }
    }else{
        if (self.waitMB){
            [MSFunction closeHUD:self.waitMB];
            self.waitMB=nil;
        }
        [MSFunction openIntervalHUD:[NSString stringWithFormat:@"%@",error]];
    }
}];
[updataTask resume];
self.waitMB = [MSFunction openHUD:@"正在上傳數(shù)據(jù)"];}

實際上,完成這個并不難乱陡,只是剛開始沒有接觸浇揩,不知道多文件上傳的原理有點犯愁,只要保證拼接的格式的正確憨颠,基本還是很簡單的胳徽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爽彤,隨后出現(xiàn)的幾起案子养盗,更是在濱河造成了極大的恐慌,老刑警劉巖适篙,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往核,死亡現(xiàn)場離奇詭異,居然都是意外死亡嚷节,警方通過查閱死者的電腦和手機聂儒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硫痰,“玉大人衩婚,你說我怎么就攤上這事⌒О撸” “怎么了非春?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缓屠。 經(jīng)常有香客問我奇昙,道長,這世上最難降的妖魔是什么敌完? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任储耐,我火速辦了婚禮,結(jié)果婚禮上蠢挡,老公的妹妹穿的比我還像新娘弧岳。我一直安慰自己,他們只是感情好业踏,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布禽炬。 她就那樣靜靜地躺著,像睡著了一般勤家。 火紅的嫁衣襯著肌膚如雪腹尖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天伐脖,我揣著相機與錄音热幔,去河邊找鬼。 笑死讼庇,一個胖子當著我的面吹牛绎巨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蠕啄,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼场勤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歼跟?” 一聲冷哼從身側(cè)響起和媳,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哈街,沒想到半個月后留瞳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡骚秦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年她倘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片作箍。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡帝牡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒙揣,到底是詐尸還是另有隱情靶溜,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布懒震,位于F島的核電站罩息,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏个扰。R本人自食惡果不足惜瓷炮,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望递宅。 院中可真熱鬧娘香,春花似錦苍狰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至安接,卻和暖如春翔忽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盏檐。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工歇式, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胡野。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓材失,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硫豆。 傳聞我的和親對象是個殘疾皇子豺憔,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

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