iOS分享 - AFNetworking之多图片/文件上传

本文分享了使用AFNetworking进行多图片上传的经验,包括解决图片名称重复问题、如何正确设置参数以及图片压缩技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在分享经验之前,先说点题外话,之前的一个项目涉及到了多图片的上传,本来以为是一个很简单的事情,却着实困扰了我好久,究其原因,一是我不够细心,二是与后台人员的交流不够充分。在此,我想将我的老师常说的一句话送给大家:“做一个细心的男人(女人)”。好了,闲话少说,进入正题。

  AFNetworking是我们在日常开发中,常用于发送网络请求的第三方类库。其中,我们经常用到的方法有两类,一是普通的网络请求,其常用方法为:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //GET请求  
  2. - (AFHTTPRequestOperation *)GET:(NSString *)URLString  
  3.                      parameters:(id)parameters  
  4.                         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success  
  5.                         failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure  
  6. //POST请求  
  7. - (AFHTTPRequestOperation *)POST:(NSString *)URLString  
  8.                       parameters:(id)parameters  
  9.                          success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success  
  10.                          failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure  


 对此,我不多说,相信大家都会,第二类就是我要重点说的上传文件的网络请求,跟普通的网络请求方法十分相似:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. - (AFHTTPRequestOperation *)POST:(NSString *)URLString  
  2.                       parameters:(id)parameters  
  3.        constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block  
  4.                          success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success  
  5.                          failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure  


这个方法中多了一个block匿名函数,它会在网络请求发送之前调用,我们要添加所需上传图片的数据,就要在这里进行,如:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //设置网络请求管理者  
  2.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  3.    //发送网络请求  
  4.    [manager POST:url parameters:paramsDic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {  
  5.      for (int i = 0; i < self.imageArr.count; i++) {  
  6.        UIImage *image = self.imagArr[i];  
  7.        NSData *data = UIImagePNGRepresentation(image);  
  8.        [formData appendPartWithFileData:data name:[NSString stringWithFormat:@"photos[%d]",i] fileName:[NSString stringWithFormat:@"image%d.png",i] mimeType:@"image/png"];  
  9.      }  
  10.     } success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  11.   
  12.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  13.           
  14.     }];  

注意:

  1、name:多文件上传时,name不能重复,不能重复,不能重复,重要的事情说三遍,我就是在这里卡住了,当时我的接口文档中让我传的参数是“photos[]”,结果我真的傻乎乎的只传了一个“photos[]”,其结果就是只有一张图片上传成功,这也体现了交流的重要性,至于具体怎么传,接口文档一般都有说明,如不清楚,请与后台人员沟通,这是服务器用于接收你所上传文件的参数名,十分重要。

  2、fileName:不能重复,这个名字由用户决定,只要不重复,其它没有要求。

  3、mimeType:你所要上传文件的类型,各种文件所对应的类型详情请自己百度。

  上传图片一般会与相册与照相机结合使用,但是其图片一般较大,可使用UIImageJPEGRepresentation(image, 0.1)方法对图片进行一定程度的压缩,具体压缩情况要结合你的实例。作一点说明:UIImagePNGRepresentation(image)与UIImageJPEGRepresentation(image, 0.1)方法都会返回图片的data数据,如果将data数据转化成图片,图片类型由后缀名决定,如果保存为.png后缀的图片,就是png图片,如果保存为.jpg后缀的图片,则就是jpg图片,故不要被方法名中的PNG和JPEG所影响。

  最后,提醒一下大家:有时候你可能碰到上传图片的网络请求失败,从而会怀疑自己是不是用错了方法,如果你的文件上传是利用multipart/form-data请求上传,则使用上述方法是没有错的,这时你需要与你的后台成员多进行沟通,因为错的并不一定是你,自信一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值