圖片上傳基本在每個(gè)App上都會(huì)用到,經(jīng)常用到的有兩種方式们何,一種方式是base64字符串上傳圖片萄焦,另一種方式是使用二進(jìn)制流進(jìn)行上傳圖片,我個(gè)人比較喜歡使用二進(jìn)制流上傳垂蜗,這種方式無(wú)論是上傳單張圖片還是多張圖片楷扬,速度都比較快的。
下面分別介紹一下使用AFN3.x如何進(jìn)行單張和多張圖片的上傳:
1贴见、單張圖片上傳
首先烘苹,初始化AFHTTPSessionManager,并做相關(guān)屬性的配置:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:@"服務(wù)器地址"];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];//請(qǐng)求
manager.responseSerializer = [AFHTTPResponseSerializer serializer];//響應(yīng)
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
manager.requestSerializer.timeoutInterval = 30;//超時(shí)時(shí)間
然后提前設(shè)置好要上傳的圖片的名稱(chēng)片部,一般以時(shí)間命名镣衡,便于區(qū)分:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 設(shè)置時(shí)間格式
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.png", str];
接下來(lái)將要上傳的圖片,轉(zhuǎn)為NSData類(lèi)型就可以上傳了
[manager POST:url parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> formData){
NSData *data = UIImageJPEGRepresentation(image,0.5);//image為要上傳的圖片
[formData appendPartWithFileData:data name:@"file" fileName:fileName mimeType:@"image/png"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
}success:^(NSURLSessionDataTask *task, id responseObject) {
NSData *data = responseObject;
NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"上傳成功 %@",dic);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
}];
如果需要實(shí)時(shí)地獲取上傳的進(jìn)度档悠,直接在progress的block回調(diào)中獲取即可廊鸥。
到目前為止,單張圖片就可以順利的上傳了辖所,接下來(lái)惰说,說(shuō)一下如何上傳多張圖片
2、多張圖片上傳
多張圖片上傳和單張圖片上傳的思路基本上是一致的缘回,只不過(guò)在圖片命名的時(shí)候有一些區(qū)別吆视,而且這個(gè)區(qū)別非常重要,實(shí)踐證明:如果命名錯(cuò)誤的話(huà)酥宴,只會(huì)有一張圖片上傳成功啦吧。
前面就不贅述的,直接從上傳開(kāi)始說(shuō):
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 設(shè)置時(shí)間格式
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
[manager POST:url parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[imageArr enumerateObjectsUsingBlock:^(UIImage * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
UIImage *image = imageArr[idx];//圖片數(shù)組
NSData *data = UIImageJPEGRepresentation(image,0.5);
NSString *fileName = [NSString stringWithFormat:@"%@%ld.jpg", str,idx];
[formData appendPartWithFileData:data name:[NSString stringWithFormat:@"List[%ld]",idx] fileName:fileName mimeType:@"image/jpeg"];
}];
} progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSData *data = responseObject;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"上傳成功:%@",dic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
大家要注意:我所說(shuō)的文件名稱(chēng)不一樣拙寡,指的并不是fileName授滓,而是name,List為后臺(tái)指定的圖片文件的參數(shù)名肆糕,多張圖片使用“[]+數(shù)字”的方式進(jìn)行命名即可般堆。