2012-05-09 21 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 char配列の無効な長さ」を取得する方法。どうしましたか? トークンとJSONをhttp://hurl.it/に貼り付け、それを使用してリクエストを行うと、すべて正常になります。

私はこの問題がbase64の文字列の/シンボルであり、JSONの結果/シンボルであると思います。 [postData length]と思われるかもしれません。\/文字をJSON文字列から削除すると: 9j4AAQSkZJRgABAQAAAQABAAD4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACqADAAQAAAABAAAACgAAAAD2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQHZリクエストは正常に実行されますが、このbase64でエンコードされた文字列は同じではありません。

+0

'post'および/または' request'を記録します。あなたが正しいと思わないものはログに記録してください。 –

答えて

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; 
} 

希望します。