【问题标题】:HTTP POST request to send an image发送图像的 HTTP POST 请求
【发布时间】:2014-05-14 16:12:13
【问题描述】:

我正在尝试通过 HTTP POST 请求将图像发布到网络服务。

API 文档说 image 参数应该是“您要分析的图像的二进制文件数据 - 仅限 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 图像中获取二进制文件数据?

谢谢, 科拉多

【问题讨论】:

  • 把你的uimage转成base64编码,然后把字符串传给服务器,
  • 永远记住,你不能将图像直接存储到服务器中,你需要遵循 3 个步骤,1.你的图像 2.将 UIImage 赋予 NSData 3.将 NSData 赋予 NSString 然后最后将字符串传递给服务器,
  • 您是否检查过您的图像已成功存储在服务器路径中
  • 我将 NSData *imgData = UIImageJPEGRepresentation(image, 1.0) 替换为 NSString *imgData = [UIImageJPEGRepresentation(image, 1.0) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength] 并修改了 [request setHTTPBody:[imgData dataUsingEncoding:NSUTF8StringEncoding] 行] 但我总是得到同样的错误。这是您建议的正确实施吗?谢谢
  • 实际上你无法将图像发布到服务器或从服务器获取图像

标签: ios image post nsurlrequest


【解决方案1】:

如果您想简化代码,可以使用简单的 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];

【讨论】:

  • 我也试过你的代码(我不得不用 addFileToUpload 替换 setFileToUpload,然后完成块正确完成)但我仍然得到同样的错误(“你必须提供图像”)。当然我做错了什么,但我不明白是什么!图像在资源中,所以我将行更改为 [r addFileToUpload:[[NSBundle mainBundle] pathForResource:@"air" ofType:@"jpg" inDirectory:@""] parameterName:@"photo"]。你有什么主意吗 ? API说我需要上传图片的二进制数据......我应该在上传之前对图片做些什么吗?谢谢。
  • 是的,它有效!非常感谢...我被这个问题困住了!您的代码是我见过的最简单的代码,而且效果很好。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2016-07-03
  • 1970-01-01
相关资源
最近更新 更多