Base 64 кодирование случайного поведения UIImage - PullRequest
0 голосов
/ 13 декабря 2011

Я отправляю изображение на сервер путем преобразования объекта NSData в объект NSString с использованием схемы Base64 с помощью ....

 NSData *imgData=UIImagePNGRepresentation([objCP userImage]);
 NSString *encodedString=[Base64Coder encodeData:imgData];

Я наблюдаю случайное поведение .... иногда я получаю "==" в закодированной строке в конце строки, и изображение не загружается. Между строкой могут быть и другие символы. Если я не получить эти символы в конце ... изображение загружается. Чтобы преодолеть это ... Я также использовал этот метод для преобразования этих символов в действительные (предполагается, что они приняты) ::

-(NSString *)urlEncodedVersion:(NSString *)strString
{ 
    NSMutableString *strTemp = [[NSMutableString alloc] initWithFormat:@"%@",strString] ;
    NSArray *escapeChars = [NSArray arrayWithObjects:@";",@"?",@":",@"@", @"&",@"=",@"+",@"$",@",", @"[",@"]",@"#",@"!",@"’",@"(", @")",@"*",@" ",nil];

    NSArray *replaceChars = [NSArray arrayWithObjects: @"%3B",@"%3F",@"%3A",
                             @"%40",@"%26",@"%3D", @"%2B",@"%24",@"%2C",@"%5B",@"%5D", @"%23",@"%21",@"%27", @"%28",@"%29",@"%2A",@"%20",nil];

    //NSMutableString *tempStr = [[self mutableCopy] autorelease]; 
    for(int i = 0; i < [escapeChars count]; i++)
    {
        [strTemp replaceOccurrencesOfString:[escapeChars objectAtIndex:i] withString:[replaceChars objectAtIndex:i] options:NSLiteralSearch range:NSMakeRange(0,[strTemp length])];
    } 
    return strTemp;
}

но он также не служит.

Это все мое тело сообщения ::

-(void)uploadProfileInfo:(CreateProfile *)objCP
{

    NSData *imgData=UIImagePNGRepresentation([objCP userImage]);
    NSString *encodedString=[Base64Coder encodeData:imgData];

    NSString *refinedString=[self urlEncodedVersion:encodedString];

    NSString *soapMessage = [NSString stringWithFormat:

                             @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                             "<soapenv:Envelope \n"
                             "xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" \n"
                             "xmlns:tem=\"http://tempuri.org/\" \n"
                             "xmlns:wcf=\"http://schemas.datacontract.org/2004/07/NextToMe_BusinessEntity\"> \n"
                             "<soapenv:Header/>\n"
                             "<soapenv:Body>\n"
                             "<tem:CreateProfile>\n"

                             "<tem:objUser>\n"

                             "<wcf:Email>%@</wcf:Email>\n"

                             "<wcf:Mode>%@</wcf:Mode> \n"

                             "<wcf:Name>%@</wcf:Name>\n"

                             "<wcf:ProfileImage>%@</wcf:ProfileImage>\n"

                             "<wcf:RequestDateTime>%@</wcf:RequestDateTime>\n"

                             "<wcf:Status>%@</wcf:Status>\n"

                             "<wcf:StatusSpecified>%@</wcf:StatusSpecified>\n"

                             "<wcf:UDID>%@</wcf:UDID>\n"

                             "</tem:objUser>\n"

                             "</tem:CreateProfile>\n"

                             "</soapenv:Body>\n"

                             "</soapenv:Envelope>\n",[objCP email],[objCP mode],[objCP name],encodedString,@"",[objCP status],[objCP statusSpecified],[objCP UDID]];





    NSURL *url = [NSURL URLWithString:kBaseURL];               
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];             
    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];          
    [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];       
    [theRequest addValue: @"http://tempuri.org/XXXX/CreateProfile" forHTTPHeaderField:@"Soapaction"];
    [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
    [theRequest setHTTPMethod:@"POST"];     
    [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    if( theConnection )
    {
        webData = [[NSMutableData data] retain];
    }
    else
    {
        NSLog(@"The Connection is NULL");
    }

}

1 Ответ

1 голос
/ 13 декабря 2011

Символы =, которые вы видите в конце, являются отступами. Это соответствует RFC4648 3.2. Заполнение закодированных данных. Другой конец должен быть в состоянии переварить это. Видимо, этого не происходит. Вы должны сравнить поведение со сторонней библиотекой, чтобы проверить правильность кодировки или декодирования. Если вы можете заставить его работать, удаляя отступы, то это хорошо для вас, но это ошибка в библиотеке декодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...