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


How to use PHP to return an image to Objective-C?

我在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];
}

几个观察结果:

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

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

  2. 顺便说一句,仅当您使用带有startImmediately选项的initWithRequest格式副本并将该选项设置为 NO(仅在特殊情况下使用)时,才调用 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 观看此交易的发生,并确保它是响应中的图像,等等。