iOS上傳文件

參加工作也有一段時(shí)間了,自己覺(jué)得是時(shí)候?qū)ψ约汗ぷ鞯慕?jīng)驗(yàn)做一點(diǎn)總結(jié)了,也是為了以后閑時(shí)能看看自己的成長(zhǎng)吧亭螟。所以,是時(shí)候?qū)扅c(diǎn)什么了阶女。

通過(guò)Http上傳文件

因?yàn)閕OS不能通過(guò)html表單來(lái)進(jìn)行post上傳,所以iOS想要完成上傳功能就要自己實(shí)現(xiàn)http請(qǐng)求
http post請(qǐng)求的格式是這樣的

Content-type:multipart/formdata, boundary=boundary

--boundary
Content-disposition: form-data; name="name"

mike

--boundary
Content-disposition: form-data; name: "pic", filename: "myPic.jpg"
Content-type: image/jpg

<myPic.jpg>

--boundary--

這就是我們上傳時(shí)需要配置的http
boundary規(guī)定的是什么,后面就要一樣杨名。boundary 是分割各個(gè)參數(shù)的分隔符。 注意:boundary結(jié)尾時(shí),是--boundary--,代表請(qǐng)求體結(jié)束仁堪。multipart/formdata 上傳的請(qǐng)求頭必須包含一個(gè)特殊的信息:Content-type 其值也必須是multipart/formdata 如果是一個(gè)文件則需要文件信息filename:"myPic.jpg"與文件內(nèi)容類型Content-type:image/jpg,<myPic.jpg> 則是我們想要上傳的圖片或者文件球匕。
一定要嚴(yán)格按照規(guī)則,否則不會(huì)成功

下面是iOS實(shí)現(xiàn)代碼:

    NSDictionary *param = @{@"name":@"mike"};
    NSString *TWITTERFON_FORM_BOUNDARY = @"12344321";
    NSMutableURLRequest *mulrequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http"] cachePolicy:(NSURLRequestReloadIgnoringLocalCacheData) timeoutInterval:10];
    NSString *boundary = [NSString stringWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
    NSString *endBoundary = [NSString stringWithFormat:@"--%@--",TWITTERFON_FORM_BOUNDARY];
    UIImage *image = [UIImage imageNamed:@"pic"];
    NSData *imageData = UIImageJPEGRepresentation(image, 0.3);
    NSMutableString *body = [NSMutableString string];
    NSArray *keys = [param allKeys];
    for (NSString *key in keys) {
        [body appendFormat:@"%@\r\n",boundary];
        [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
        [body appendFormat:@"%@\r\n",[dic objectForKey:key]];
    }
    [body appendFormat:@"%@\r\n",boundary];
    [body appendFormat:@"Content-Disposition:form-data; name=\"pic\"; filename=\"myPic.jpg\"\r\n"];
    [body appendFormat:@"Cotent-Type: image/png"];
    NSMutableData *requestData = [NSMutableData data];
    [requestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
    [requestData appendData:imageData];
    [requestData appendData:[[NSString stringWithFormat:@"\r\n%@",endBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    NSString *content = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
    [mulrequest setValue:content forHTTPHeaderField:@"Content-Type"];
    [mulrequest setValue:[NSString stringWithFormat:@"%lu", [requestData length]] forHTTPHeaderField:@"Content-Length"];
    [mulrequest setHTTPBody:requestData];
    [mulrequest setHTTPMethod:@"POST"];
    NSURLSessionConfiguration *sessionCon = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionCon];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:mulrequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"complite");
    }];
    [task resume];

AFN上傳

通常,我們并不需要配置如此麻煩的東西.因?yàn)榭傆幸恍┐笊駚?lái)幫助我們.我們熟悉的AFN框架就很好的解決這些麻煩的配置問(wèn)題,這一章主要來(lái)看看如何通過(guò)AFN來(lái)實(shí)現(xiàn)文件上傳.在下一章,會(huì)對(duì)AFN的主要源碼進(jìn)行分析,敬請(qǐng)期待
AFN代碼如下

AFHTTPSessionManager *sharedManager1 = [[AFHTTPSessionManager alloc]init];
sharedManager1.requestSerializer = [AFHTTPRequestSerializer serializer];
sharedManager1.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain",nil];
sharedManager1.requestSerializer.timeoutInterval =20;
[sharedManager1.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[sharedManager1.requestSerializer setValue:@"text/html; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    NSDictionary *dic = @{@"param.token":_token};
[sharedManager1 POST:kUploadFile parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        for (int i = 0; i < fileUpload.count; i ++) {
                NSData *data = UIImageJPEGRepresentation(fileUpload[i], 0.3);
                NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                // 設(shè)置時(shí)間格式
                formatter.dateFormat = @"yyyyMMddHHmmss";
                NSString *str = [formatter stringFromDate:[NSDate date]];
                NSString *fileName = [NSString stringWithFormat:@"%@-%@.jpeg", str,[NSString stringWithFormat:@"%d",i]];
                [formData appendPartWithFileData:data name:@"fileUpload" fileName:fileName mimeType:@"image/jpeg"];     
        }
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        success(task,responseObject);
    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
        fail(task,error);
    }];

我們?cè)谏蟼鲌D片是需要對(duì)圖片進(jìn)行壓縮編碼,通常是使用UIImageJPEGRepresentation(,) 方法 float數(shù)一般是0.3~0.5

其他上傳方式

當(dāng)然,系統(tǒng)的NSURLSession 類提供了專門上傳的方法

- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request;

AFN的上傳就是基于這個(gè)方法完成的,有興趣的可以百度了解一下,下一節(jié)我會(huì)對(duì)AFN的主要源碼進(jìn)行分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市施掏,隨后出現(xiàn)的幾起案子钮惠,更是在濱河造成了極大的恐慌,老刑警劉巖七芭,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件素挽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡狸驳,警方通過(guò)查閱死者的電腦和手機(jī)预明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耙箍,“玉大人撰糠,你說(shuō)我怎么就攤上這事”缋ィ” “怎么了窗慎?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)卤材。 經(jīng)常有香客問(wèn)我,道長(zhǎng)峦失,這世上最難降的妖魔是什么扇丛? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮尉辑,結(jié)果婚禮上帆精,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好卓练,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布隘蝎。 她就那樣靜靜地躺著,像睡著了一般襟企。 火紅的嫁衣襯著肌膚如雪嘱么。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天顽悼,我揣著相機(jī)與錄音曼振,去河邊找鬼。 笑死蔚龙,一個(gè)胖子當(dāng)著我的面吹牛冰评,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播木羹,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼甲雅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坑填?” 一聲冷哼從身側(cè)響起抛人,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎穷遂,沒(méi)想到半個(gè)月后函匕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚪黑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盅惜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忌穿。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抒寂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掠剑,到底是詐尸還是另有隱情屈芜,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布朴译,位于F島的核電站井佑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏眠寿。R本人自食惡果不足惜躬翁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盯拱。 院中可真熱鬧盒发,春花似錦例嘱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蛮艰,卻和暖如春腋腮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背印荔。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工低葫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仍律。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓嘿悬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親水泉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子善涨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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