HTTP로 파일을 업로드하면서 업로드 되는 프로그레스바를 구현할 필요성이 생겼다.

UIAlertView를 이용하여 UIProgressView를 올려서 간단하게 구현해 보았다.
HTTP 커넥션은 NSURLConnection의 delegate를 이용하였고 ASIHTTPRequest를 이용해도 무관하다.

1. 헤더파일에 다음 두개의 변수를 선언
@interface TestFileUploadViewController : UIViewController {
    UIProgressView *progressView;
    UIAlertView *progressAlert;
}

@property (nonatomic, retain) UIProgressView *progressView;
@property (nonatomic, retain) UIAlertView *progressAlert;

@end

2. 구현부에서는 파일을 선택해서 업로드를 시작한 후에 progressView를 생성하여 화면에 보여주면 된다.
   프로그레스바의 값을 NSURLConnection의 delegate를 통해 알아와서 넣어 준다.

//NSURLConnection을 통해 파일업로드하는 메소드
-(void)fileUpload{
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    /*
       이 부분은 파일 업로드할 때 정의 하는 부분입니다. 본 포스팅에서는 다루지 않겠습니다.
    */
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    [connection start];  // connection을 만드셨으면 업로드 시작
   
    //프로그레스바 생성 및 화면에 보여줌
    self.progressAlert = [[UIAlertView alloc] initWithTitle:@"Please wait..."
                                                    message:@"파일 업로드 중입니다"
                                                   delegate:self cancelButtonTitle:nil
                                          otherButtonTitles:nil];
    self.progressAlert.tag = 12;
    self.progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(30.0f, 80.0f, 225.0f, 90.0f)];
    [self.progressAlert addSubview:self.progressView];
    [self.progressView setProgressViewStyle:UIProgressViewStyleBar];
    [self.progressAlert show];
    [self.progressAlert release];
}

//총 파일의 크기와 현재까지 업로드된 파일의 크기를 이 메소드를 통해서 알 수 있다.
   적당히 계산해서 프로그레스바에 넣어준다.
-(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{
    NSLog(@"uploading %d    %d    %d",bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
    float num = totalBytesWritten;
    float total = totalBytesExpectedToWrite;
    float percent = num/total;
    self.progressView.progress = percent;
}

//파일 업로드 완료 되었을 때
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
   
    NSString *returnString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",returnString);  // 리턴값이 있다면 확인해 볼 수 있다.
   
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:@"파일이 업로드 되었습니다"
                                                   delegate:self cancelButtonTitle:@"확인"
                                          otherButtonTitles:nil];
   
    [alert show];
    [alert release];
   
    [returnString release];
    NSLog(@"didReceiveData == %@", returnString);
}

//끝나면 프로그레스바가 있는 Alert을 닫아준다.
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"upload end");
    [self.progressAlert dismissWithClickedButtonIndex:0 animated:YES];  
}

//파일 업로드 중 실패하였을 경우
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"upload fail");
    [self.progressAlert dismissWithClickedButtonIndex:0 animated:YES];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:@"파일이 업로드를 실패하였습니다."
                                                   delegate:self cancelButtonTitle:@"확인"
                                          otherButtonTitles:nil];
   
    [alert show];
    [alert release];
}

////////////////////////////////////////////////////////////////////////////////
파일 업로드할 때 구현부는 직접 작성하시기 바라며
ASIHTTPRequest를 이용하시는 분들은 메소드만 살짝씩 바꿔서 쓰시면 될것 같습니다.