如何使用PHP将图像返回到Objective-C?

如何使用PHP将图像返回到Objective-C?,php,ios,objective-c,ubuntu,nsurlconnection,Php,Ios,Objective C,Ubuntu,Nsurlconnection,我有一个PHP脚本,可以在我的服务器上抓取一个图像。我希望它能够将它发送到Objective-C。我已经尝试了许多方法,我发现这些方法都无法返回图像。我将图像存储在我的服务器上的一个目录中,我希望能够将其发送到我的应用程序。这是我当前的代码: 代码只是没有改变图像。我不知道如何检查PHP是否正确发送图像 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSMutableURLRequest *requ

我有一个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
    方法即可收到整个图像。这不是一个有效的假设。(事实上,除非您的图像非常小,否则这实际上是不可能的。)

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

  • 顺便说一句,如果您使用
    initWithRequest
    的格式副本,并将
    立即开始
    选项设置为
    (仅在特殊情况下使用),则仅调用
    开始
    。在这种情况下,只需删除
    start
    调用即可

  • 您应该检查接收到的数据是否真的是图像。例如,在
    didReceiveResponse
    中,确保
    nsurResponse
    statusCode
    为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);
            }
        }
    }
    
  • 您可能希望使用监视此事务的发生,并确保它是响应中的图像,等等


  • 您是否检查了
    direceivedata
    中的
    data
    是否真的是图像?PHP是否响应图像内容类型?@Raptor我如何检查?您应该首先了解nsurlconnection的委托,或者简单地使用易于处理的block。如果图像多次下降,我如何一次获得所有内容?您无法控制。你必须假设它会分为几个部分。因此,创建
    NSMutableData
    属性,在开始连接之前将该属性实例化为
    [NSMutableData]
    ,让
    didReceiveData
    仅将接收到的数据附加到
    NSMutableData
    中,并仅将其转换为
    ConnectiondFinishLoading
    中的
    UIImage
    ,或者,正如chings228所建议的,放弃这种复杂的基于委托的方法,使用类似于
    sendAsynchronousRequest
    的方法,这要简单得多。。。