经历了一个新的项目,也是一个新的团队.图片上传,成了重点.
1.图片上传服务器之后,在获取的时候被旋转了90度.
解决办法为:将回调的image对象进行如下处理,
if (image.imageOrientation != UIImageOrientationUp)
{
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
[image drawInRect:(CGRect){0,0,image.size}];
UIImage * normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
image = normalizedImage;
}
2.有的照片在没有完全从icould下载完成的时候,代理方法获取到的image为nil.或者选取图片的代理方法不走.
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;
第一个代理方法选取的照片为没有完全从icould下载完成,那么这个代理方法是不执行的.(上传后台可能不被旋转)
第二个代理方法获取图片方法如下,这个代理方法执行,但是获取到的image对象是空的,这需要我们用代码是去判断,不然对image进行操作的话,容易因为image为nil造成崩溃.(上传后台可能被旋转)
UIImage *image = info[UIImagePickerControllerOriginalImage];
3.多图上传.
这个需要后台的配合,oc代码实现如下
+ (void)post:(NSString *)url target:(UIViewController *)target params:(NSDictionary *)params fileDatas:(NSArray *)fileDatas name:(NSString *)name fileNames:(NSArray *)fileNames mimeTypes:(NSArray *)mineTypes success:(void (^)(id json))success failure:(void (^)(NSError *error))failure
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
if (target)
{
[MBProgressHUD showHUDAddedTo:target.view animated:YES];
}
// 1.创建一个管理者
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
session.requestSerializer.timeoutInterval = 10;
session.responseSerializer = [AFHTTPResponseSerializer serializer];
session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html",@"image/png", @"text/plain",nil];//,@"text/plain"
// 2.发送请求
NSDictionary * dic = [BaseHttp encryptionDictionary:params withEnp:YES];
JMLog(@"%@",dic);
[session POST:url parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData)
{
// 在发送请求之前会自动调用这个block
// 需要在这个block中添加文件参数到formData中
if (fileDatas.count == fileNames.count && fileNames.count == mineTypes.count)
{
for (int i = 0; i < fileDatas.count; i++)
{
[formData appendPartWithFileData:fileDatas[i] name:[NSString stringWithFormat:@"%@%d",name,i] fileName:fileNames[i] mimeType:mineTypes[i]];
}
}
} progress:^(NSProgress * _Nonnull uploadProgress)
{
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
if (target)
{
[MBProgressHUD hideHUDForView:target.view];
}
if (success)
{
success([BaseHttp decodingData:responseObject]);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
if (target)
{
[MBProgressHUD hideHUDForView:target.view];
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;
} if (failure) { failure(error); } }];}
调用示例:这个方法要求传入的不是iamge对象.是UIImageJPEGRepresentation方法转换之后的图片
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSDictionary * params = @{@"type":@"3"};
NSArray * array = @[UIImageJPEGRepresentation([UIImage imageNamed:@"card_placeholder_1"], 0.5),UIImageJPEGRepresentation([UIImage imageNamed:@"card_placeholder_2"], 0.5),UIImageJPEGRepresentation([UIImage imageNamed:@"card_placeholder_3"], 0.5),UIImageJPEGRepresentation([UIImage imageNamed:@"card_placeholder_1"], 0.5),];
[BaseHttp post:[NSString stringWithFormat:@"%@%@",@"http://img.upload.com",@"/appinlet/test_upload"] params:params fileDatas:array name:@"image" fileNames:@[@"1",@"2",@"3",@"4"] mimeTypes:@[@"image/png",@"image/png",@"image/png",@"image/png"] success:^(id json)
{
JMLog(@"%@",json);
} failure:^(NSError *error)
{
JMLog(@"%@",error);
}];
}
总结:图片选取应该这么干,非空判断,防止图片被后台旋转
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
UIImage * image = info[UIImagePickerControllerOriginalImage];
if (!image)
{
return;
}
if (image.imageOrientation != UIImageOrientationUp)
{
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
[image drawInRect:(CGRect){0,0,image.size}];
UIImage * normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
image = normalizedImage;
}
[self dismissViewControllerAnimated:YES completion:nil];
}