afn post请求上传文件_iOS Post上传图片, 文件流的形式

最近看到群里很多小伙伴有问上传图片服务器收不到, 解析不了. 可以说就一个属性 ContentType , 不论你使用第三方的AFN, 还是自己封装NSURLSesstion. 都需要把ContentType 设置和后台的解析方式一样(可能术语不是很标准, 总之就这个意思哈,谅解)

下面贴两段上传图片代码不过可能只是针对我的服务器. 只要和后台同学沟通好就行了

一, 自己封装afn的请求

**********.h

/**

* 上传图片文件

*

* @param URL 请求地址

* @param parameters 请求参数

* @param images 图片数组

* @param name 文件对应服务器上的字段

* @param fileName 文件名

* @param mimeType 图片文件的类型,例:png、jpeg(默认类型)....

* @param progress 上传进度信息

* @param success 请求成功的回调

* @param failure 请求失败的回调

*

* @return 返回的对象可取消请求,调用cancle方法

*/

+ (WWURLSessionTask *)uploadWithURL:(NSString *)URL parameters:(NSDictionary *)parameters images:(NSArray *)images name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType progress:(HttWWrogress)progress success:(HttpRequestSuccess)success failure:(HttpRequestFailed)failure showHub:(BOOL)showHub;

*********.m

+ (WWURLSessionTask *)uploadWithURL:(NSString *)URL parameters:(NSDictionary *)parameters images:(NSArray *)images name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType progress:(HttWWrogress)progress success:(HttpRequestSuccess)success failure:(HttpRequestFailed)failure showHub:(BOOL)showHub

{

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithDictionary:parameters];

AFHTTPSessionManager *manager = [self createAFHTTPSessionManager:showHub];

return [manager POST:URL parameters:dic constructingBodyWithBlock:^(id _Nonnull formData) {

//压缩-添加-上传图片

[images enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) {

NSData *imageData = UIImageJPEGRepresentation(image, 0.5);

[formData appendPartWithFileData:imageData name:name fileName:[NSString stringWithFormat:@"%@%ld.%@",fileName,idx,mimeType?mimeType:@"jpeg"] mimeType:[NSString stringWithFormat:@"image/%@",mimeType?mimeType:@"jpeg"]];

}];

} progress:^(NSProgress * _Nonnull uploadProgress) {

//上传进度

progress ? progress(uploadProgress) : nil;

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

[SVProgressHUD dismiss];

success(responseObject);

WWLog(@"responseObject 上传成功= %@",responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

[SVProgressHUD dismiss];

failure ? failure(error) : nil;

WWLog(@"error = %@",error);

}];

}

二 . AFN 经典图片上传

//此body是向后台传的参数, 因为是上传图片, 所以只给个图片名就够了, 这个和后台去问

NSDictionary * body = @{@"category":@"user",@"file":@"HeadImg"};

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//ContentType设置

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"image/jpeg",@"image/png",@"application/octet-stream",@"text/json",nil];

manager.requestSerializer= [AFHTTPRequestSerializer serializer];

manager.responseSerializer= [AFHTTPResponseSerializer serializer];

[manager POST:url parameters:body constructingBodyWithBlock:^(id _Nonnull formData) {

//把image 转为data , POST上传只能传data

NSData *data = UIImagePNGRepresentation(image);

//上传的参数(上传图片,以文件流的格式)

[formData appendPartWithFileData:data

name:@"file"

fileName:@"gauge.png"

mimeType:@"image/png"];

} progress:^(NSProgress * _Nonnull uploadProgress) {

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

//请求成功的block回调

NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];

NSLog(@"上传成功%@",dic);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

NSLog(@"上传失败%@",error);

}];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值