2012-03-17 57 views
0

我很難過。嘗試使用NSURLConnection發佈到php腳本。在這一整個下午,我想現在是時候尋求幫助。我已經閱讀了很多帖子,這裏@ NSURLConnection,但我仍然沒有想出我的錯誤。難倒:NSURLConnection + php - 鍵/值格式問題

我上傳了一個圖像,有兩個鍵/值對:userfileuser。我正在使用的ObjC代碼如下。日誌輸出顯示字符串(跳過圖像數據)。我使用底部的php腳本在瀏覽器中測試我的服務器端php:它工作正常。所以我以某種方式搞砸了ObjC代碼。

任何人看到我錯了?

//日誌輸出

----------------------------- 14737809831466499882746641449

內容 - 處置:表單數據;

userfile的= someImage &用戶=睏倦;

內容類型:應用/八位字節流

// objC

NSData *imageData = UIImageJPEGRepresentation(img, .5); 

NSString *urlString = @"http://example.com/loader.php"; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 

[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

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

NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; \r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

NSString * user = @"sleepy"; 

[body appendData:[[NSString stringWithString:@"userfile=someImage"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"&user=%@;\r\n", user] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

NSString * testOutput = [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]; 
NSLog(testOutput); // log it 

[body appendData:[NSData dataWithData:imageData]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

// setting the body of the post to the reqeust 
[request setHTTPBody:body]; 

// now lets make the connection to the web 
[NSURLConnection 
sendAsynchronousRequest:request 
queue:[NSOperationQueue mainQueue] 
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

    NSLog(@"Response: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

}]; 

//瀏覽器

<?php 
$directory_self = str_replace(basename($_SERVER['PHP_SELF']), '', $_SERVER['PHP_SELF']); 
$uploadHandler = 'http://' . $_SERVER['HTTP_HOST'] . $directory_self . 'cuploader.php'; 

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd"> 

<html lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> 
    <link rel="stylesheet" type="text/css" href="stylesheet.css"> 
    <title>Upload form</title> 
</head> 
<body> 
<form id="Upload" action="<?php echo $uploadHandler ?>" enctype="multipart/form-data" method="post"> 
    <h1> 
     Test 
    </h1> 
    <p> 
     <label for="userfile">File to upload:</label> 
     <input id="userfile" type="text" name="userfile"> 
    </p> 
    <p> 
     <label for="user">User</label> 
     <input id="user" type="text" name="user"> 
    </p> 
    <p> 
     <label for="submit">Press to...</label> 
     <input id="submit" type="submit" name="submit" value="Upload me!"> 
    </p> 

</form> 
</body> 
</html> 

回答

2

這是我使用發送POST數據的功能。 。

-(void)sendData:(NSString*)data toServer:(NSString*)url{ 
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
NSData *postData = [data dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:url]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; 
[request setHTTPBody:postData]; 
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 
if(conn){ 
    //Connection successful 
} 
else{ 
    //Connection Failed 
} 

[conn release]; 

}

當 '數據' 串是在@ 「&用戶=用戶名&通=口令」 的形式,等等

對於上傳圖像,我補充一點:

NSData *jpeg = [[NSData alloc] initWithData:UIImagePNGRepresentation(image)]; 
//UIImageJPEGRepresentation 
NSString *param = @""; 
NSString *footer = [NSString stringWithFormat:@"\n--%@--\n", @"0194784892923"]; 

param = [param stringByAppendingString:[NSString stringWithFormat:@"--%@\n", @"0194784892923"]]; 
param = [param stringByAppendingString:@"Content-Disposition: form-data; name=\"userfile\";filename=\"image.png\"\nContent-Type: image/png\n\n"]; 
//NSLog(@"jpeg size: %d", [jpeg length]); 

NSMutableData *data = [NSMutableData data]; 
[data appendData:[param dataUsingEncoding:NSASCIIStringEncoding]]; 
[data appendData:jpeg]; 
[data appendData:[[UserInfo retrieveSingleton].userName dataUsingEncoding:NSASCIIStringEncoding]]; 
[data appendData:[footer dataUsingEncoding:NSASCIIStringEncoding]]; 

希望這有助於。

+0

謝謝 - 我會試試看。 – 2012-03-17 04:49:51