图片上传基本在每个App上都会用到,经常用到的有两种方式,一种方式是base64字符串上传图片,另一种方式是使用二进制流进行上传图片,我个人比较喜欢使用二进制流上传,这种方式无论是上传单张图片还是多张图片,速度都比较快的。
下面分别介绍一下使用AFN3.x如何进行单张和多张图片的上传:
1、单张图片上传
首先,初始化AFHTTPSessionManager,并做相关属性的配置:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:@"服务器地址"];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];//请求
manager.responseSerializer = [AFHTTPResponseSerializer serializer];//响应
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
manager.requestSerializer.timeoutInterval = 30;//超时时间
然后提前设置好要上传的图片的名称,一般以时间命名,便于区分:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 设置时间格式
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.png", str];
接下来将要上传的图片,转为NSData类型就可以上传了
[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) {
}];
如果需要实时地获取上传的进度,直接在progress的block回调中获取即可。
到目前为止,单张图片就可以顺利的上传了,接下来,说一下如何上传多张图片
2、多张图片上传
多张图片上传和单张图片上传的思路基本上是一致的,只不过在图片命名的时候有一些区别,而且这个区别非常重要,实践证明:如果命名错误的话,只会有一张图片上传成功。
前面就不赘述的,直接从上传开始说:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 设置时间格式
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];//图片数组
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) {
}];
大家要注意:我所说的文件名称不一样,指的并不是fileName,而是name,List为后台指定的图片文件的参数名,多张图片使用“[]+数字”的方式进行命名即可。