NSURLSession 을 이용한 파일업로드에 대해 알아보자.

 

파일 업로드라는게 은근 짜증난다. 값 하나만 안맞아도 업로드가 되지 않는다...

 

다음 코드를 살펴보자.


//self.imageUploadUrl 업로드를 할 url
    
    NSString *POST_BODY_BOURDARY = [[NSUUID UUID] UUIDString];
    NSString *uploadUrl = [self.imageUploadUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
    
    //upload single image
    NSURL *url = [NSURL URLWithString:uploadUrl];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0];
    [request setHTTPMethod:@"POST"];
    
    // set Content-Type
    NSString *contentTypeValue = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", POST_BODY_BOURDARY];
    [request setValue:contentTypeValue forHTTPHeaderField:@"Content-type"];
    
    // image jpg 압축
    NSData *imageData = UIImageJPEGRepresentation(image, 0.9);
    
    // post body > form-data 의 name 이 중요하다.
    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", POST_BODY_BOURDARY] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"fileUpload\"; filename=\"%@.jpg\"\r\n", @"ios_upload"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", POST_BODY_BOURDARY] dataUsingEncoding:NSUTF8StringEncoding]];
    
    //url session 을 생성하고,
    //NSURLSessionUploadTask 를 생성해서 파일을 업로드 하자.
    //body 데이터를 formData 에 넣어준다.
    NSURLSession *urlSession = [NSURLSession sharedSession];
    NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        if(error) {
            NSLog(@"upload Error %@", [error description]);
        }else {
            if(data) {
                NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                
                //String 값
                //Dictionary 형태가 필요하면 NSJSONSerialization 를 사용하자.
                NSLog(@"-------%@", response);
                
                //response 값을 가지고 수행할 것이 있다면 여기서 하면 된다.
            }
        }
    }];
    
    [uploadTask resume]; //resume 으로 실행시켜준다.

 

휴... 파일업로드 기능은 항상 파라미터 문제로 삽질을 하곤 한다.

Posted by 자바리즘
,