2012-05-09 46 views
1

我遇到問題。我需要將base64字符串轉換爲JSON字符串並將其傳遞給服務器。 例如我有一個base64字符串/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACqADAAQAAAABAAAACgAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/Z將圖像轉換爲base64並以JSON格式上傳到服務器

我需要將其轉換爲JSON格式。我做到以下幾點:

+(NSData *)prepareForUploading:(NSString *)base64Str 
{ 
    NSDictionary *dict=[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:base64str, nil] forKeys:[NSArray arrayWithObjects:@"picture", nil]]; 

    NSData *preparedData=[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];  
    return preparedData; 
}; 

這裏我是如何做NSURLRequest

-(NSString *)uploadPict:(NSString *)pict 
{ 
    NSLog(@"Server: upload: called"); 
    NSData *prepPictData=[[self class] prepareForUploading:pict]; 
    NSString *preparedBase64StrInJSON=[[NSString alloc] initWithData:prepPictData encoding:NSUTF8StringEncoding]; 

    //here I'm adding access token to request 
    NSString *post = [NSString stringWithFormat:@"accessToken=%@&object=%@", self.key, preparedBase64StrInJSON]; 
    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@upload.aspx", serverAPIPath]]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"postLength" forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData];  

    NSURLResponse *response; 
    NSError *error; 
    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
    //.... 
} 

,但我得到「一個基地,64字符數組長度無效」從服務器。怎麼了? 如果我將我的令牌和JSON粘貼到http://hurl.it/並使用它發出請求 - 一切正常。

我認爲問題是在base64字符串中的/符號以及JSON中的結果/符號。 也許這是[postData length]:如果我從JSON字符串中刪除\/個字符: 9j4AAQSkZJRgABAQAAAQABAAD4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACqADAAQAAAABAAAACgAAAAD2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQHZ請求將正常執行,但是這個base64編碼的字符串是不一樣的。

請幫我解決這個問題

+0

記錄'發佈'和/或'請求'。哎呀,記錄你懷疑的任何事情可能都不對。 –

回答

4

的jstring是你的base64字符串,首次使用以下行

[self encodeString:jString];

然後打電話使用以下。

NSString *URL = [NSString stringWithFormat:@"forms.asmx/CreateUpdate?"]; 

URL=[NSString stringWithFormat:@"%@%@", USERS_API_ROOT_URL, URL]; 
NSString *post = [NSString stringWithFormat:@"apiKey=A0B1I2L3A4L5-A1D3-4F30-5AB2-C8DEE266&strPost=%@",jString]; 

unsigned long long postLength = [post length]; 
NSString *contentLength = [NSString stringWithFormat:@"%llu",postLength]; 

NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ; 
[request setURL:[NSURL URLWithString:URL]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:contentLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData ]; 

(void)[[NSURLConnection alloc] initWithRequest:request delegate:self]; 


-(NSString *)encodeString:(NSString *)string 
{ 
    NSString *newString = (__bridge_transfer NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL,CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); 
    return newString; 
} 

希望它能工作。

相關問題