iOS AFNetworking 圖片上傳(修改使用者頭像功能)
阿新 • • 發佈:2019-02-15
今天在處理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];
}
最後 這裡可能還存在一些問題。 因為考慮使用者登入後從伺服器去取圖片會有網路因素的影響。 我這裡是在進入頁面的時候去儲存過圖片的沙盒路徑中去拿圖片。 這也是為什麼要寫入沙盒的原因。
但是 存在使用者選擇了圖片 放棄上傳操作的可能。但此時沙盒路徑下得檔案已經修改。所以會存在圖片載入有誤的問題。(所以考慮儲存到沙盒的時機 ) 這裡我會及時解決下次貼出來的。 或者有解決的簡單方法各位請告知。