先介紹一下背景啊,本人是一名從業(yè)2.5年+的IOS開(kāi)發(fā)工程師。平時(shí)喜歡搞點(diǎn)小研究,技術(shù)上雖然跟大牛們差很遠(yuǎn),但是個(gè)人覺(jué)得寫(xiě)點(diǎn)對(duì)別人有幫助的文章也不是什么壞事。
這篇文章主要是為了一些不了解圖片上傳的過(guò)程的同學(xué)們準(zhǔn)備的,之前好幾個(gè)群友都提到了使用AFNetWorking上傳圖片不了解是什么過(guò)程。可能都是從網(wǎng)上Copy過(guò)來(lái)的代碼,所以不是很清楚流程才導(dǎo)致的不知道該在哪里寫(xiě)什么參數(shù)。設(shè)置什么參數(shù)。
下面我就跟大家分享一下。使用Web和AFNetWorking的上傳過(guò)程。
兩個(gè)前臺(tái)的代碼加上一個(gè)PHP后臺(tái)的代碼我想大家會(huì)足夠明白圖片的上傳流程了。這就是我舉兩個(gè)例子的原因了,對(duì)比著看或許更加事半功倍吧。
首先先從Web上傳圖片開(kāi)始說(shuō)起。貼段代碼解釋一下吧。
<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í)沒(méi)有什么可以說(shuō)的懂html的都知道。
是一個(gè)提交表單。
要點(diǎn):
method=”post” :設(shè)置HTTP請(qǐng)求方式為POST請(qǐng)求
enctype=”multipart/form-data” :這個(gè)是一個(gè)需要了解的地方multipart/form-data這個(gè)值用于支持向服務(wù)器發(fā)送二進(jìn)制數(shù)據(jù)。這個(gè)大家是不是看著感覺(jué)似曾相識(shí)的感覺(jué)呢? AFMultipartFormData協(xié)議,這個(gè)肯定不陌生了吧。其實(shí)AFMultipartFormData協(xié)議的作用就等價(jià)于multipart/form-data這個(gè)了。
剛好提到AFMultipartFormData這個(gè)協(xié)議,那么下面我貼上另外的AFNetWorking上傳圖片的代碼吧。大家都知道,由于IOS不能像Web那樣通過(guò)提交表單來(lái)上傳數(shù)據(jù),那么我們只能通過(guò)HTTP請(qǐng)求來(lái)提交數(shù)據(jù)。代碼如下
UIImage *image = [UIImage imageNamed:@"測(cè)試圖片.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ù)。沒(méi)有錯(cuò),代碼先做了個(gè)POST請(qǐng)求,然后使用此協(xié)議起到了類(lèi)似Web提交表單中圖片的作用。
POST:parameters:constructingBodyWithBlock: 此方法為AFNetWorking中自帶方法。百度查一下即可。
前面我介紹了那么多前段的操作,下面我們來(lái)看下服務(wù)器端怎么來(lái)接收?qǐng)D片。以PHP后臺(tái)為例子了。
簡(jiǎn)單的寫(xiě)了個(gè)PHP上傳圖片的后臺(tái)。
<?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’]沒(méi)錯(cuò),就是這個(gè)了用來(lái)獲取表單中name為fileData的二進(jìn)制圖片數(shù)據(jù)。獲取到這張圖片數(shù)據(jù)之后將圖片保存至服務(wù)器。至此為圖片上傳至服務(wù)器的全部流程了。
可能寫(xiě)的不是那么好,不是那么有價(jià)值。但是個(gè)人感覺(jué)還是很實(shí)用,希望不喜勿噴。