2013-02-12 58 views
0

我在我的服務器上有一個ASP.NET MVC。 Iphone正在向ASP.NET MVC控制器發送一個Http請求。下面是iPhone的代碼,服務器沒有從iPhone獲取正確格式的數據?

-(void)addNSData:(NSData*)datapart inData:(NSMutableData*)POSTBody forkey:(NSString*)key 
{ 
    [POSTBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [POSTBody appendData:[[NSString stringWithFormat:@"%@", datapart] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [POSTBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
} 

{ 
    NSMutableURLRequest *request = nil; 
    request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://XXX/XXX/publish"]]; 

NSString *jsonFilePath = [[SharedData shareData].pageDataFolderPath stringByAppendingPathComponent:@"page_json.json"]; 

[ request setHTTPMethod: @"POST" ]; 
[request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", POSTBoundary] forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:@".ASPXAUTH=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" forHTTPHeaderField:@"Cookie"]; 

// Add HTTP Body 
NSMutableData *POSTBody = [NSMutableData data]; 
    [POSTBody appendData:[[NSString stringWithFormat:@"--%@\r\n",POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [self addNSData:[NSData dataWithContentsOfFile:localZipPath] inData:POSTBody forkey:@"zipFile"]; 
    [self addNSData:[NSData dataWithContentsOfFile:jsonFilePath] inData:POSTBody forkey:@"contents"]; 
    NSString *v = page.mo_page.version; 
    [self addNSData:[v dataUsingEncoding:NSUTF8StringEncoding] inData:POSTBody forkey:@"version"]; 
    [self addNSData:[@"true" dataUsingEncoding:NSUTF8StringEncoding] inData:POSTBody forkey:@"isActive"]; 
    [self addNSData:[page.mo_page.pageid dataUsingEncoding:NSUTF8StringEncoding] inData:POSTBody forkey:@"directory"]; 

    // Add the closing -- to the POST Form 
    [POSTBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    // Add the body to the myMedRequest & return 
    [request setHTTPBody:POSTBody]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

    if(error) 
    { 
     NSLog(@"Error if any:%@",error.localizedDescription); 

    } 
    else { 
     NSLog(@"Response : %@",[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]); 
    } 
    [[NSFileManager defaultManager] removeItemAtPath:localZipPath error:nil]; 
    localZipPath = nil; 
} 

的ASP.NET MVC服務器獲取數據以這種格式,例如

Request.Form["Directory"]= "<32383862 33363339 36393538 34653463 62643862 35376561 66653135 35313764>" 

回答

1

當你看到 「」 < 32383862 ......「,這就是你將會看到你的NSData是否爲'描述'(NSData * foo; ...; NSLog(@「FOO:%@」,foo);)你需要做的是通過獲取實際字節的長度對象,然後是「字節」指針。

NSData *foo; 
// set foo to some data object 
NSUInteger len = [data length]; 
uint8_t *ptr = [data bytes]; 
memcpy(toSomeLocation, ptr, len); 
+0

謝謝。你能提供一些示例代碼嗎? – user960567 2013-02-12 17:09:32

+0

你應該看看你的代碼,你在哪裏引用數據。你的代碼正如我所說的將NSData對象視爲一個字符串,因此它返回NSString @「<3333 4444 5555 ....」。 – 2013-02-12 21:48:52

+0

謝謝我已經替換了'[POSTBody appendData:[[NSString stringWithFormat:@「%@」,datapart] dataUsingEncoding:NSUTF8StringEncoding]]'''POSTBody appendData:datapart];'它可以工作。現在它的工作但現在zipFile爲空 – user960567 2013-02-13 06:06:30

2

應使用內容類型「multipart/form-data」提交包含文件,非ASCII數據和二進制數據的表單。

[request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", POSTBoundary] forHTTPHeaderField:@"Content-Type"]; 

不應該是「application/json」?
你說的是你的請求包含二進制數據,這就是服務器期望的,這就是它得到的。

+0

其實我必須提交文件以及其他數據。見上面,'[self addNSData:[NSData dataWithContentsOfFile:localZipPath] inData:POSTBody forkey:@「zipFile」]'。實際上,我需要在Iphone中執行相同的操作,以便在您提交多部分表單數據時正常瀏覽器發送。我使用多部分表單數據測試html頁面,這些數據在我的ASP.NET MVC控制器中以正確的格式提交值(包括文件) – user960567 2013-02-12 17:08:00

相關問題