2013-11-20 53 views
0

我正在開發一個iphone應用程序並使用POST請求,我已經閱讀了許多帖子,但是仍然不能正常工作,我會感謝一些幫助,這裏是我的代碼:使用Objective C上傳圖像到PHP服務器

-(void) connectionDidFinishLoading:(NSURLConnection *)connection 
    { 
     //NSArray *json_data = [NSJSONSerialization JSONObjectWithData:web_data   options:kNilOptions error:NULL]; 
     NSString *returningString = [[NSString alloc] initWithData:web_data encoding:NSUTF8StringEncoding]; 
     NSLog(@"returned string = %@", returningString); 

     [loadingView stopLoading]; 
    } 

我的PHP端,只告訴我,它以這種方式獲得:

  //turning the image into a NSData object 
     //getting the image back out of the UIImageView 
     //setting the quality to 72 

     NSData *image_data = UIImageJPEGRepresentation(picture, 72); 

     // setting up the URL to post to 
     NSMutableString *urlString = [[NSMutableString alloc] init]; 
     [urlString appendString:BASE_URL]; 
     [urlString appendString:@"mobile_services/mobile_store_services/upload_wishlist_image/"]; 
     //[urlString appendString:@"/temp_trash/temporal.php"]; 

     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
     [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
     [request setHTTPShouldHandleCookies:NO]; 
     [request setTimeoutInterval:30]; 
     [request setURL:[NSURL URLWithString:urlString]]; 
     [request setHTTPMethod:@"POST"]; 

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

     // file 
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"test.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

     [body appendData:image_data]; 
     [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

     // Text parameter1 
     NSString *param1 = @"parameter text"; 
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"texto_prueba\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithString:param1] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

     // close form 
     [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     // set request body 
     [request setHTTPBody:body]; 

     NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     if(conn){ 
      web_data = [NSMutableData data]; 
     }else{ 
      NSLog(@"doesn't exist"); 
     } 

我使用NSURLConnectionDataDelegate協議的話,我在這個方法中接收到的數據

public function upload_wishlist_image() 
    { 

     var_dump($_REQUEST); 

    } 

請幫忙!,PHP沒有收到任何圖片數據。

+0

我已經找到了解決方案,它只是將NSData編碼爲base64,將它作爲一個普通的NSString傳遞給它的主體,它完美地工作。 –

回答

1

看起來你已經放棄了這項技術並轉換爲base 64.我不怪你,因爲手動創建這些請求非常麻煩。將來,如果您使用AFNetworking提出請求,生活會更容易。

無論如何,如果你有興趣知道你的代碼不工作,第一個問題是NSMutableURLRequest。這是非常,非常接近,儘管一些觀察:

  1. ,您應該使用文件的MIME類型(在這種情況下image/jpeg),並只使用application/octet-stream如果你不知道的MIME類型文件。所以你應該消除那條線。

  2. 在二進制數據之前,除了最後一行之外,每行的末尾應該使用\r\n

因此,而不是:

[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"test.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

你應該有:

[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"userfile\"; filename=\"test.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: image/jpeg\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

其次,一旦你解決請求,PHP $_REQUEST變量應該僅由'texto_prueba' => 'parameter text'組成。如果你沒有看到,那麼我會質疑你如何從URL映射到你的PHP函數。

但是,根據您上傳的圖片,您不會在$_REQUEST中找到該圖片。參數userfile將返回$_FILES,而不是$_REQUEST

另一個最後的觀察:您正在通過UIImageJPEGRepresentation將圖像轉換回NSData。如果您可以抓取NSData(通過dataWithContentsOfFile),這可能比往返跳過UIImage並返回到NSData更好,這會導致圖像質量下降和元數據丟失。

+0

非常感謝您的時間,是的,我放棄了這一點,但我會盡快與您的建議嘗試。 對於Url,我使用.h文件來定義它,就像這樣#define BASE_URL @「http://www.example.com.co/」 –