【问题标题】:How to use PHP to return an image to Objective-C?如何使用 PHP 将图像返回给 Objective-C?
【发布时间】:2014-11-20 02:24:11
【问题描述】:

我有一个 PHP 脚本,可以在我的服务器上抓取图像。我希望它能够将其发送到 Objective-C。我尝试了许多方法,我发现这些方法可以返回图像,但似乎都没有。我将图像存储在我的服务器上的一个目录中,我希望能够将它发送到我的应用程序。这是我当前的代码:

代码不会改变图像。我不确定如何检查 PHP 是否正确发送图像。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"myserverurl"]];
    [request setHTTPMethod:@"POST"];

    NSString *body = @"username=benr783&password=testpassword";
    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
    NSURLConnection *connect = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connect start];

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    self.image.image = [UIImage imageWithData:data];

}

【问题讨论】:

  • 你检查过didReceiveData中的data真的是一张图片吗? PHP 响应是否带有图像内容类型?
  • @Raptor 我如何检查这个?
  • 你应该先了解nsurlconnection的delegate或者干脆用block比较好处理

标签: php ios objective-c ubuntu nsurlconnection


【解决方案1】:

几个观察:

  1. 您似乎假设只需调用didReceiveData 方法即可收到整个图像。这不是一个有效的假设。 (事实上​​,除非您的图像非常小,否则这实际上不太可能。)

    在开始连接之前,在didReceiveData 中实例化一个NSMutableData 对象,您只需将接收到的数据附加到该NSMutableData,然后在connectionDidFinishLoading 中,一旦您合并了所有接收到的数据在多次调用didReceiveData 到单个NSMutableData 中,您现在可以使用最终的NSMutableData 并尝试将其转换为UIImage

  2. 顺便说一句,如果您使用带有startImmediately 选项并且该选项设置为NO(仅在特殊情况下使用)的initWithRequest 的再现,请仅调用start。在这种情况下,只需删除 start 调用即可。

  3. 您应该检查接收到的数据是否真的是图像。例如,在didReceiveResponse 中,确保NSURLResponsestatusCode 为200。确保didFailWithError 未被调用。等等。

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
            int statusCode = [(NSHTTPURLResponse *)response statusCode];
            if (statusCode != 200) {
                NSLog(@"statusCode != 200; it is %ld", (long)statusCode);
            }
        }
    }
    
  4. 您可能希望使用Charles 观看此交易,并确保它是响应图像等。

【讨论】:

  • 如果图像多次出现,我如何一次得到它?
  • 你无法控制。你必须假设它会部分下降。因此,创建NSMutableData 属性,在开始连接之前将该属性实例化为[NSMutableData data],让didReceiveData 只需将接收到的数据附加到您的NSMutableData,然后仅将其转换为connectionDidFinishLoading 中的UIImage
  • 或者,正如 chings228 所建议的,放弃这种复杂的基于委托的方法,使用类似sendAsynchronousRequest 的方法,这样更简单......
猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多