今天在处理APP中用户信息这里,遇到了上传与用户修改头像的问题,在网上查阅一些资料之后完成了,写了一下。贴上来供大家看看。
可以看到 在点击上部ImageView 的时候调用相册去选择某张图片。
下面贴出点击图片后代码:
#pragma mark - image picker delegte
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissViewControllerAnimated:YES completion:^{}];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
//01.21 应该在提交成功后再保存到沙盒,下次进来直接去沙盒路径取
// 保存图片至本地,方法见下文
[self saveImage:image withName:@"currentImage.png"];
//读取路径进行上传
NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"currentImage.png"];
UIImage *savedImage = [[UIImage alloc] initWithContentsOfFile:fullPath];
isFullScreen = NO;
self.headImgV.tag = 100;
[self.headImgV setImage:savedImage];//图片赋值显示
//进到次方法时 调 UploadImage 方法上传服务端
**NSDictionary *dic = @{@"image":fullPath}; //重点再次 fullPath 为路径
[memberMan UploadImage:dic];**
}
这里是上文调用的保存沙盒方法:
#pragma mark - 保存图片至沙盒(应该是提交后再保存到沙盒,下次直接去沙盒取)
- (void) saveImage:(UIImage *)currentImage withName:(NSString *)imageName
{
NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);
// 获取沙盒目录
NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:imageName];
// 将图片写入文件
[imageData writeToFile:fullPath atomically:NO];
}
这里接第一部分进入上传的方法:
//头像上传
-(void)UploadImage:(NSDictionary *)type
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:APIImageUp parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//01.21 测试
NSString * imgpath = [NSString stringWithFormat:@"%@",type[@"image"]];
//取之前存入沙盒的路径
UIImage *image = [UIImage imageWithContentsOfFile:imgpath];
NSData *data = UIImageJPEGRepresentation(image,0.7);
//这里注意UIImageJPEGRepresentation 详情看下图格式
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.jpg", str];
[formData appendPartWithFileData:data name:@"Filedata" fileName:fileName mimeType:@"image/jpg"];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
//成功后处理
NSLog(@"Success: %@", responseObject);
NSString * str = [responseObject objectForKey:@"fileId"];
if (str != nil) {
[self.delegate uploadImgFinish:str];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
上传后 下次进入页面时从沙盒加载图片:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//从沙盒拿
NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"currentImage.png"];
UIImage *savedImage = [[UIImage alloc] initWithContentsOfFile:fullPath];
[self.headImgV setImage:savedImage];
}
最后 这里可能还存在一些问题。 因为考虑用户登录后从服务器去取图片会有网络因素的影响。 我这里是在进入页面的时候去保存过图片的沙盒路径中去拿图片。 这也是为什么要写入沙盒的原因。
但是 存在用户选择了图片 放弃上传操作的可能。但此时沙盒路径下得文件已经修改。所以会存在图片加载有误的问题。(所以考虑保存到沙盒的时机 ) 这里我会及时解决下次贴出来的。 或者有解决的简单方法各位请告知。
特此感谢标哥博客对我一些思路的帮助:http://blog.youkuaiyun.com/woaifen3344/article/details/41897431,有问题的各位可以去看看。