0

I am trying to encode image using base64 encoding and pass it through JSON , to generate JSON request and call RESTful API I am using RestKit.

What I have seen in the log is RestKit adds escape characters to encoded image, this is preventing server end from decoding image effectively and fails.

I want to know whats the best option to stop RestKit from adding escape characters

below is the example

VpT\/X8WWDCpj1XBpJ1zPBDuwLHLnpCZgnmLX3EXaffi0p7NklAPgO7HZsmxzC\/XITc\/K4iwRSG

One can see slashes (\/) added to the string.

Here is the code that i m using for encoding string

NSData *originalPhoto = UIImagePNGRepresentation([UIImage imageNamed:@"Time_Icon.png"]);
NSString *base64PhotoString = [Base64 encode:originalPhoto];

Base64.m as follows

+ (NSString*) encode:(const uint8_t*) input length:(NSInteger) length {
    NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t* output = (uint8_t*)data.mutableBytes;

    for (NSInteger i = 0; i < length; i += 3) {
        NSInteger value = 0;
        for (NSInteger j = i; j < (i + 3); j++) {
            value <<= 8;

            if (j < length) {
                value |= (0xFF & input[j]);
            }
        }

        NSInteger index = (i / 3) * 4;
        output[index + 0] =                    encodingTable[(value >> 18) & 0x3F];
        output[index + 1] =                    encodingTable[(value >> 12) & 0x3F];
        output[index + 2] = (i + 1) < length ? encodingTable[(value >> 6)  & 0x3F] : '=';
        output[index + 3] = (i + 2) < length ? encodingTable[(value >> 0)  & 0x3F] : '=';
    }

    return [[[NSString alloc] initWithData:data
                                  encoding:NSASCIIStringEncoding] autorelease];
}


+ (NSString*) encode:(NSData*) rawBytes {
    return [self encode:(const uint8_t*) rawBytes.bytes length:rawBytes.length];
}

I am passing this encoded string to RestKit request as a string

vishal dharankar
  • 7,536
  • 7
  • 57
  • 93
  • What approach are you taking to creating the base64 string (show the code)? – Wain Mar 28 '15 at 14:17
  • @Wain added details you asked for please check – vishal dharankar Mar 28 '15 at 14:21
  • @wain my issue is similar to this http://stackoverflow.com/questions/14724868/afnetworking-base64-parameter-characters-being-escaped-by-nsjsonserialization but not sure about what the answer is exactly talking about – vishal dharankar Mar 28 '15 at 14:22
  • The other answer reads as if it's a server issue dealing with the supplied encoding, not a client issue... – Wain Mar 28 '15 at 15:37
  • @wain sure but that's not possible when server API is already in production and other clients like web and android are working without issue – vishal dharankar Mar 28 '15 at 16:25

3 Answers3

0

If i am not wrong you are stuck at send image to server via restkit. My Friend try with multipart.

In Restkit v0.20.3 have few changes. Here i add code snippet for multipart post via RkObjectManager instance.

NSString *strTextToPost = self.txtViewForPost.text;
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    mediaType ? [params setObject:mediaType forKey:@"MEDIA_TYPE"] : @"";
    strTextToPost ? [params setObject:strTextToPost forKey:@"POST_TEXT"] : @"" ;

    NSMutableURLRequest *request = [[AppDelegate appDelegate].rkomForPost multipartFormRequestWithObject:nil method:RKRequestMethodPOST path:strPath parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileData:contentData
                                    name:@"FILE"
                                fileName:fileName
                                mimeType:fileType];
    }];

    RKObjectRequestOperation *operation = [[AppDelegate appDelegate].rkomForPost objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        [RSActivityIndicator hideIndicator];
        NSLog(@"%@",operation.HTTPRequestOperation.responseString);
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        [RSActivityIndicator hideIndicator];
        NSLog(@"%@",operation.HTTPRequestOperation.responseString);
    }];
    [[AppDelegate appDelegate].rkomForPost enqueueObjectRequestOperation:operation];

enqueueObjectRequestOperation will complete multipart operation. Try with given code. Surely it will works.

Siten
  • 4,515
  • 9
  • 39
  • 64
0

In the iOS 7 and Mac OS 10.9 SDKs, Apple introduced new base64 methods on NSData that make it unnecessary to use a 3rd party base 64 decoding library.

But as per my experience I faced issue while using Apple provided base64 methods, and was not able to decode my base64 pdf (from an .net server).

So I gave a try to this library and it worked for me as every time. I think this will work for you also.

Yuvrajsinh
  • 4,536
  • 1
  • 18
  • 32
0

As restkit uses AFNetworking and it seems to be adding escape characters to encoded image my server end couldn't handle that , I have confirmed that this is AFNetworking issue not Restkit itself and seems like they have resolved it in 2.0 but since RestKit is stuck with old version it can't be solved , finally I gave up and opted for ASIHTTP library and passed JSON fabricated manually ensuring that base64 encoded image doesn't get tampered. That resolved the issue.

vishal dharankar
  • 7,536
  • 7
  • 57
  • 93