在分享經驗以前,先說點題外話,以前的一個項目涉及到了多圖片的上傳,原本覺得是一個很簡單的事情,卻着實困擾了我很久,究其緣由,一是我不夠細心,二是與後臺人員的交流不夠充分。在此,我想將個人老師常說的一句話送給你們:「作一個細心的男人(女人)」。好了,閒話少說,進入正題。服務器
AFNetworking是咱們在平常開發中,經常使用於發送網絡請求的第三方類庫。其中,咱們常常用到的方法有兩類,一是普通的網絡請求,其經常使用方法爲:網絡
//GET請求 - (AFHTTPRequestOperation *)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure //POST請求 - (AFHTTPRequestOperation *)POST:(NSString *)URLString parameters:(id)parameters success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
對此,我很少說,相信你們都會,第二類就是我要重點說的上傳文件的網絡請求,跟普通的網絡請求方法十分類似:app
- (AFHTTPRequestOperation *)POST:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
這個方法中多了一個block匿名函數,它會在網絡請求發送以前調用,咱們要添加所需上傳圖片的數據,就要在這裏進行,如:函數
//設置網絡請求管理者 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //發送網絡請求 [manager POST:url parameters:paramsDic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { for (int i = 0; i < self.imageArr.count; i++) { UIImage *image = self.imagArr[i]; NSData *data = UIImagePNGRepresentation(image); [formData appendPartWithFileData:data name:[NSString stringWithFormat:@"photos[%d]",i] fileName:[NSString stringWithFormat:@"image%d.png",i] mimeType:@"image/png"]; } } success:^(AFHTTPRequestOperation *operation, id responseObject) { } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }];
注意:post
一、name:多文件上傳時,name不能重複,不能重複,不能重複,重要的事情說三遍,我就是在這裏卡住了,當時個人接口文檔中讓我傳的參數是「photos[]」,結果我真的傻乎乎的只傳了一個「photos[]」,其結果就是隻有一張圖片上傳成功,這也體現了交流的重要性,至於具體怎麼傳,接口文檔通常都有說明,如不清楚,請與後臺人員溝通,這是服務器用於接收你所上傳文件的參數名,十分重要。url
二、fileName:不能重複,這個名字由用戶決定,只要不重複,其它沒有要求。spa
三、mimeType:你所要上傳文件的類型,各類文件所對應的類型詳情請本身百度。code
上傳圖片通常會與相冊與照相機結合使用,可是其圖片通常較大,可以使用UIImageJPEGRepresentation(image, 0.1)方法對圖片進行必定程度的壓縮,具體壓縮狀況要結合你的實例。做一點說明:UIImagePNGRepresentation(image)與UIImageJPEGRepresentation(image, 0.1)方法都會返回圖片的data數據,若是將data數據轉化成圖片,圖片類型由後綴名決定,若是保存爲.png後綴的圖片,就是png圖片,若是保存爲.jpg後綴的圖片,則就是jpg圖片,故不要被方法名中的PNG和JPEG所影響。orm
最後,提醒一下你們:有時候你可能碰到上傳圖片的網絡請求失敗,從而會懷疑本身是否是用錯了方法,若是你的文件上傳是利用multipart/form-data請求上傳,則使用上述方法是沒有錯的,這時你須要與你的後臺成員多進行溝通,由於錯的並不必定是你,自信一點。blog