2014-05-12 196 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