1. 程式人生 > >iOS AFNetworking 圖片上傳(修改使用者頭像功能)

iOS AFNetworking 圖片上傳(修改使用者頭像功能)

今天在處理APP中使用者資訊這裡,遇到了上傳與使用者修改頭像的問題,在網上查閱一些資料之後完成了,寫了一下。貼上來供大家看看。
12
可以看到 在點選上部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);
    }];

}

3

上傳後 下次進入頁面時從沙盒載入圖片:

-(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];
}

最後 這裡可能還存在一些問題。 因為考慮使用者登入後從伺服器去取圖片會有網路因素的影響。 我這裡是在進入頁面的時候去儲存過圖片的沙盒路徑中去拿圖片。 這也是為什麼要寫入沙盒的原因。

但是 存在使用者選擇了圖片 放棄上傳操作的可能。但此時沙盒路徑下得檔案已經修改。所以會存在圖片載入有誤的問題。(所以考慮儲存到沙盒的時機 ) 這裡我會及時解決下次貼出來的。 或者有解決的簡單方法各位請告知。