iOS-带参数的图片上传
一、现有的两种上传方式
1. AFNetwork上传
2.NSURLMutableRequest上传
(ps:这两种方式,很多博客上已经有了就不需要我在这里再次说明了)
二、我在上传图片时遇到的问题
上面提到的两种方式我都用过了,但是后台一直返回400的信息,也没有接收到我发的消息,可以说十分苦恼。我先说明一下后台是如何接收的(后端使用的是Springboot)
对于这个带参数的图片上传工作来说,正常情况下使用AFNetwork的
[Imagesession POST:@"自己的url" parameters:需要上传的参数 headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData)
【AFHTTPSessionManager *Imagesession】来实现的,但是我却因为这样的实现方式导致后台并不能识别我的请求消息,导致我上传一直失败
三、问题的根源
我前端使用OC,后端使用java,这样难免会导致在一些属性定义上存在差异,而且由于我初期接触ios并没有对用户类进行有一个单独的定义,所以在之前我的上传数据过程中一直是需要借助页面中传参,使用时直接定义的方式来进行传输的,加上我对后端及java没有什么了解,导致我并不知道这个参数需要按照文件的方式进行传输(其实这块我也不太理解),就导致出现了上面的问题。
四:问题解决
formdata追加参数。具体我上一下代码:
带参数图片上传完整代码实现:
AFHTTPSessionManager *Imagesession = [[AFHTTPSessionManager alloc]init];
Imagesession = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"自己的url(写到端口)"]];
Imagesession.responseSerializer = [AFJSONResponseSerializer serializer];
Imagesession.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/plain", @"text/javascript", @"text/json", @"text/html", nil];
NSDictionary *params =@{XXXX自己定义};
[Imagesession POST:@"url的剩余部分" parameters:params headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[formData appendPartWithFileData:[params yy_modelToJSONData] name:@"需要和后端协调的名字" fileName:@"需要和后端协调的名字" mimeType:@"application/json;charset=utf-8"];
UIImage *image = [UIImage imageNamed:@"imgtest"];//自己的图片
NSData *imagedata = UIImageJPEGRepresentation(image, 0.5);
[formData appendPartWithFileData:imagedata name:@"file" fileName:@"图片名字.jpg" mimeType:@"image/jpg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
// NSLog(@"%fA",uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"上传成功");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"上传失败");
NSLog(@"%@C",error);
NSLog(@"error ==%@", [error userInfo][@"com.alamofire.serialization.response.error.string"]);
}];