[ios] 서버에 이미지만 보낼 때와 이미지 + 정보를 보낼 때

2013. 1. 4. 14:55제2외국어/iOS

iPhone 에서 사진을 찍은 후, 이미지를 어디론가로 보낼 때.
사진 그 자체로만 보낸다면 그리 어렵지 않습니다.


* 서버에 이미지만 보낼 때

예를들어 

1. 찍은 이미지 정보 
: 밑에는 AVCaptureStillImageOutput 를 활용해 사진을 찍은게 아니라 현재 보이는 화면을 캡쳐한 이미지입니다.
( 차이점은 사진 찍은 것보다 데이터가 적다고 생각하시면 됩니다. 찍은게 아니라 캡쳐니깐요!! )

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];

2. body 에 저장

[body appendData: imageData];

3. 보내기

[request setHTTPBody : body];

끝입니다. 이미 데이터 형식이니 body 에다가 붙여서 body 를 보내기만 하면 됩니다.
물론 받는 쪽에서도 처리해야할 게 있습니다.

---- 참고 ( NSData 를 UIImage 로 Convert ) ---
: UIImage *image = [[UIImage alloc] initWithData : imageData];
==> imageData 라는 NSData 형식의 자료를 UIImage 형식으로 바꾸어서 image 에 저장.



* 서버에 정보 + 이미지 보낼 때

단!! 단순히 이미지만 보내는게 아니라 이미지에 관한 정보를 더해서
[ 이미지에 관한 or 그냥 정보 + 이미지 데이터 ] 를 보낸다면 방식을 다르게 해주어야 합니다.

지금부터 하는 방식은 가장 단순하고 무식한, 손쉬운 방법입니다.

목표 : '이미지 이름 + 캡쳐한 날짜 + 이미지' 를 보낸다.
방법 : 이미지, 즉 NSData를 NSString 형식으로 변환해서 통짜 NSString 으로 보낸다.

중요!!
- 이미지, 즉 NSData 를 NSString 로 변환할 때 base64로 encoding 을 해주셔야 합니다.
- 헌데, 예전에 사용했던 [NSData encodeBase64ForData]; 가 언제부터인지 사라졌습니다. ㅠ
- 그래서 base64 encoding 함수를 직접 구하셔야 됩니다. (아래는 base64 함수입니다. ) 




원본 사이트 

- (NSString*)base64forData:(NSData*)theData {

    const uint8_t* input = (const uint8_t*)[theData bytes];
    NSInteger length = [theData length];
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t* output = (uint8_t*)data.mutableBytes;
    NSInteger i;

    for (i=0; i < length; i += 3) {

        NSInteger value = 0;

        NSInteger j;

        for (j = i; j < (i + 3); j++) {
            value <<= 8;
            if (j < length) {
              value |= (0xFF & input[j]);
            }

        }
        NSInteger theIndex = (i / 3) * 4;

        output[theIndex + 0] =                    table[(value >> 18) & 0x3F];
        output[theIndex + 1] =                    table[(value >> 12) & 0x3F];
        output[theIndex + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
        output[theIndex + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';

    }
    
    return
 [[NSString allocinitWithData:data encoding:NSASCIIStringEncoding];






ex) 방식은 xml, json 형식이 있지만 현재 사용한 방법은 xml 형식입니다.

위의 base64 함수를 사용해서 
NSString *imgString = [self base64forData:imageData]; 

NSString *postStr = [[NSString alloc]init];                                                                     // 어딘가에 보낼 문자열 생성
postStr = [postStr stringByAppendingFormat:@"<Test>"];
postStr = [postStr stringByAppendingFormat:@"<imgName>%@</imgName >",subject];    // 이미지 이름
postStr = [postStr stringByAppendingFormat:@"<imgData>%@</imgData >"imgString];      // 이미지 데이터
postStr = [postStr stringByAppendingFormat:@"</Test>"];


이렇게 만든 xml 형식의 문자를 body 에 그냥 넣으시면 안되고요!! 문자니 NSUTF8StringEncoding 로 encoding 하신후에~

[body appendData:[[NSString stringWithString : postStr]dataUsingEncoding:NSUTF8StringEncoding]];

body 를 셋팅 후 보내시면 됩니다.





ps. base64 함수는 많아도 너~무 많으니 더 좋은 소스를 찾아보시거나, 직접 라이브러리와 하셔서 사용하셔도 무관합니다.

아래는 마르스 블로그에서 가져온 소스형식의 파일입니다. 

NSDataAdditions.h

NSDataAdditions.m



'제2외국어 > iOS' 카테고리의 다른 글

[iOS] Multitasking : Audio  (0) 2013.01.24
About : iOS Multitasking  (0) 2013.01.21
[simple]현재 위치 및 시간 알아내기.  (0) 2012.12.03
APNs 맛 보기.  (2) 2012.11.15
강남스타일? 코딩스타일!  (0) 2012.11.06