移动端开发iOS_CornBallast首页投稿(暂停使用,暂停投稿)

基于AFN3.x的图片上传

2017-04-27  本文已影响86人  沐泽sunshine

图片上传基本在每个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为后台指定的图片文件的参数名,多张图片使用“[]+数字”的方式进行命名即可。

上一篇下一篇

猜你喜欢

热点阅读