先介紹一下背景啊,本人是一名從業(yè)2.5年+的IOS開發(fā)工程師甚颂。平時(shí)喜歡搞點(diǎn)小研究蜜猾,技術(shù)上雖然跟大牛們差很遠(yuǎn),但是個(gè)人覺得寫點(diǎn)對別人有幫助的文章也不是什么壞事振诬。
這篇文章主要是為了一些不了解圖片上傳的過程的同學(xué)們準(zhǔn)備的蹭睡,之前好幾個(gè)群友都提到了使用AFNetWorking上傳圖片不了解是什么過程「厦矗可能都是從網(wǎng)上Copy過來的代碼肩豁,所以不是很清楚流程才導(dǎo)致的不知道該在哪里寫什么參數(shù)。設(shè)置什么參數(shù)禽绪。
下面我就跟大家分享一下蓖救。使用Web和AFNetWorking的上傳過程。
兩個(gè)前臺的代碼加上一個(gè)PHP后臺的代碼我想大家會(huì)足夠明白圖片的上傳流程了印屁。這就是我舉兩個(gè)例子的原因了循捺,對比著看或許更加事半功倍吧。
首先先從Web上傳圖片開始說起雄人。貼段代碼解釋一下吧从橘。
<html><head><meta charset="UTF-8"> <title> Upload Picture. </title></head><body><form action="handle.php" name="form" method="post" enctype="multipart/form-data"> <input type="file" name="fileData" /> <input type="submit" name="submit" value="上傳" /></form></body></html>
分析一下上面的代碼念赶,其實(shí)沒有什么可以說的懂html的都知道。
是一個(gè)提交表單恰力。
要點(diǎn):
method=”post” :設(shè)置HTTP請求方式為POST請求
enctype=”multipart/form-data” :這個(gè)是一個(gè)需要了解的地方multipart/form-data這個(gè)值用于支持向服務(wù)器發(fā)送二進(jìn)制數(shù)據(jù)叉谜。這個(gè)大家是不是看著感覺似曾相識的感覺呢? AFMultipartFormData協(xié)議,這個(gè)肯定不陌生了吧踩萎。其實(shí)AFMultipartFormData協(xié)議的作用就等價(jià)于multipart/form-data這個(gè)了停局。
剛好提到AFMultipartFormData這個(gè)協(xié)議,那么下面我貼上另外的AFNetWorking上傳圖片的代碼吧香府。大家都知道董栽,由于IOS不能像Web那樣通過提交表單來上傳數(shù)據(jù),那么我們只能通過HTTP請求來提交數(shù)據(jù)企孩。代碼如下
UIImage *image = [UIImage imageNamed:@"測試圖片.jpg"]; NSData *data = UIImageJPEGRepresentation(image, 1.0); AFHTTPSessionManager *session = [AFHTTPSessionManager manager]; [session POST:@"圖片上傳接口" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData){ [formData appendPartWithFileData :data name:@"fileData" fileName:@"圖片名稱.jpg" mimeType:@"image/jpeg"]; } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject){ } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error){ }];
到這里大家一定會(huì)發(fā)現(xiàn)有點(diǎn)神似并且會(huì)有一個(gè)共同的地方锭碳。就是共同都用到了fileData這個(gè)參數(shù)。沒有錯(cuò)勿璃,代碼先做了個(gè)POST請求擒抛,然后使用此協(xié)議起到了類似Web提交表單中圖片的作用。
POST:parameters:constructingBodyWithBlock: 此方法為AFNetWorking中自帶方法补疑。百度查一下即可歧沪。
前面我介紹了那么多前段的操作,下面我們來看下服務(wù)器端怎么來接收圖片癣丧。以PHP后臺為例子了槽畔。
簡單的寫了個(gè)PHP上傳圖片的后臺。
<?php header('Content-Type:text/json; charset=utf-8'); $file = $_FILES['fileData']; $name = $file['name']; $type = strtolower(substr($name,strrpos($name,'.')+1)); $allow_type = array('jpg','jpeg','gif','png'); if(!in_array($type, $allow_type)){ return ; } if(!is_uploaded_file($file['tmp_name'])){ return ; } $upload_path = "./"; if(move_uploaded_file($file['tmp_name'],$upload_path.$file['name'])){ $array = array( 'code' => 'success' ); echo json_encode($array); }else{ $array = array( 'code' => 'fail' ); echo json_encode($array); }?>
大家是不是又發(fā)現(xiàn)了什么胁编?$_FILES[‘fileData’]沒錯(cuò)厢钧,就是這個(gè)了用來獲取表單中name為fileData的二進(jìn)制圖片數(shù)據(jù)。獲取到這張圖片數(shù)據(jù)之后將圖片保存至服務(wù)器嬉橙。至此為圖片上傳至服務(wù)器的全部流程了早直。
可能寫的不是那么好,不是那么有價(jià)值市框。但是個(gè)人感覺還是很實(shí)用霞扬,希望不喜勿噴。