2014-05-12 249 views
0

我試圖通過HTTP POST請求將圖像發佈到webservice。發送圖像的HTTP POST請求

API文檔說圖像參數應該是「要分析的圖像的二進制文件數據 - 僅用於PNG,GIF,JPG」。

這是我想要使用的代碼:

UIImage *image = [UIImage imageNamed:@"air.jpg"]; 
    NSData *imgData = UIImageJPEGRepresentation(image, 1.0); 
    NSURLResponse *response; 
    NSError *error = nil; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://pictaculous.com/api/1.0/"] 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:60.0]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:imgData]; 

    NSData *receivedData = [NSURLConnection sendSynchronousRequest:request 
               returningResponse:&response 
                  error:&error]; 

    if(error!=nil) { 
     NSLog(@"web service error:%@",error); 
    } 
    else { 
     if(receivedData !=nil) { 
      NSError *Jerror = nil; 
      NSDictionary* json =[NSJSONSerialization 
           JSONObjectWithData:receivedData 
           options:kNilOptions 
           error:&Jerror]; 
      if(Jerror!=nil) { 
       NSLog(@"json error:%@",Jerror); 
      } 
     } 
    } 

的問題是,在JSON響應我總是收到錯誤消息「您必須提供的圖像」,就好像接收到的圖像的格式是不正確的。

是不是「UIImageJPEGRepresentation」從圖像獲取二進制數據的正確方法?

是否有任何其他方式可以從我的JPEG圖像獲取二進制文件數據?

感謝, 科拉多

+0

轉換烏爾的uImage到base64編碼,然後把這個字符串傳給服務器, –

+0

永遠記住,你無法直接將圖像存儲到服務器,U需要遵循3個步驟,1,UR圖像2將NSData的UIImage進行配置3.將NSData轉換爲NSString,然後最終將字符串傳遞給服務器 –

+0

已經檢查過你的圖像是否成功存儲在服務器路徑中 –

回答

0

如果你想簡化你的代碼,你可以使用一個簡單NSURLConnection的包裝,如STHTTPRequest

STHTTPRequest *r = [STHTTPRequest requestWithURLString:@"http://pictaculous.com/api/1.0/"]; 

NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"]; 
NSData *data = [NSData dataWithContentsOfFile:path]; 

[r addDataToUpload:data parameterName:@"image"]; 

r.completionBlock = ^(NSDictionary *headers, NSString *body) { 
    NSLog(@"-- %@", body); 
}; 

r.errorBlock = ^(NSError *error) { 
    NSLog(@"-- error: %@", error); 
}; 

[r startAsynchronous]; 
+0

我也試過你的代碼(我必須用addFileToUpload代替setFileToUpload,然後完成塊正確地完成),但我仍然得到相同的錯誤(「你必須提供一個圖像」)。當然,我做錯了什麼,但我不明白什麼!該圖像位於資源中,因此我將該行更改爲[addFileToUpload:[[NSBundle mainBundle] pathForResource:@「air」ofType:@「jpg」inDirectory:@「」] parameterName:@「photo」]。你有什麼主意嗎 ? API說我需要上傳圖片的二進制數據......我應該在上傳之前在圖片上做些什麼?謝謝。 – Corrado

+0

好,我更新了我的回覆。現在它可以工作。 – nst

+1

是的,它的工作原理!非常感謝...我被困在這個問題上!你的代碼是我見過的最簡單的代碼,效果很好。再次感謝。 – Corrado