用afnetworking删除照片

时间:2015-04-05 12:53:13

标签: php ios objective-c afnetworking

我在目标C中使用AFNetworking删除照片时遇到问题。 这是我的目标c代码:

- (void)supprimerPhoto:(NSString*)nomPhoto{
    NSString *stringUrl =URL_DELETE_PHOTO;
    //NSURL *filePath = [NSURL URLWithString:[[URL_PHOTOS stringByAppendingString:nomPhoto]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];

    NSDictionary *parameters = @{@"photo_a_supprimer" : nomPhoto};
    [manager POST:stringUrl parameters:parameters
          success:^(AFHTTPRequestOperation *operation, id responseObject) {
              NSLog(@"OK");
          }
          failure:^(AFHTTPRequestOperation *operation, NSError *error) {
              NSLog(@"error=%@", error.description);
              NSLog(@"responseString=%@", operation.responseString);
          }];
}

这是我的php:

<?php
error_reportin(E_ALL);
header('Content-type: application/json')
$photo_a_supprimer=$_POST["photo_a_supprimer"];

if (file_exists("Photos/".$photo_a_supprimer))
{
unlink("Photos/".$photo_a_supprimer); // ok c’est supprimé
}
?>

执行时我有这个错误:

2015-04-05 17:19:07.357 TableauDeChasse[4607:4457365] error=Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: internal server error (500)" UserInfo=0x792b9460 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7869db00> { URL: http://tableaudechasse.fr/DeletePhoto.php } { status code: 500, headers {
    Connection = close;
    "Content-Encoding" = gzip;
    "Content-Type" = "text/html";
    Date = "Sun, 05 Apr 2015 15:19:03 GMT";
    Server = Apache;
    "Set-Cookie" = "300gp=R393523723; path=/; expires=Sun, 05-Apr-2015 16:26:57 GMT";
    "Transfer-Encoding" = Identity;
    Vary = "Accept-Encoding";
    "X-Powered-By" = "PHP/5.4.38";
} }, NSErrorFailingURLKey=http://tableaudechasse.fr/DeletePhoto.php, NSLocalizedDescription=Request failed: internal server error (500), com.alamofire.serialization.response.error.data=<>}
2015-04-05 17:19:10.679 TableauDeChasse[4607:4457365] responseString=

有人可以解释我的连接有什么问题吗? 似乎问题来自.php,但如果你有建议那就好了。

1 个答案:

答案 0 :(得分:0)

您的PHP中有两个错误:

  1. 你拼错了error_reporting

  2. 您在header()之后缺少分号。

  3. 您可能应该返回一些JSON,否则客户端在尝试解析JSON时会失败。我建议像:

    <?php
    error_reporting(E_ALL);
    header('Content-type: application/json');
    $photo_a_supprimer = $_POST["photo_a_supprimer"];
    
    if (file_exists("Photos/".$photo_a_supprimer))
    {
        unlink("Photos/".$photo_a_supprimer); // ok c’est supprimé
        echo json_encode(Array("success" => true));
    } else {
        echo json_encode(Array("success" => false, "message" => "File not found"));
    }
    ?>
    

    显然,您必须对$photo_a_supprimer进行一些验证,以确保它不包含任何.../个字符,但这是一个基本想法。

    然后客户端代码应解析此JSON响应:

    - (void)supprimerPhoto:(NSString*)nomPhoto{
        NSString *stringUrl = URL_DELETE_PHOTO;
    
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        NSDictionary *parameters = @{@"photo_a_supprimer" : nomPhoto};
        [manager POST:stringUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
            if ([responseObject[@"success"] boolValue]) {
                NSLog(@"Success");
            } else {
                NSLog(@"failed: %@", responseObject[@"message"]);
            }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error=%@", error);
            NSLog(@"responseString=%@", operation.responseString);
        }];
    }
    

    我的原始答案(基于原始问题)如下。


    上传文件内容时会使用constructingBodyWithBlock模式,但在这种情况下,看起来PHP只是提供文件名,所以我会这样做:

    - (void)supprimerPhoto:(NSString*)nomPhoto{
        NSDictionary *parameters = @{@"photo_a_supprimer" : nomPhoto};
        [manager POST:stringUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"OK"]);   
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"error=%@", error);
            NSLog(@"responseString=%@", operation.responseString);
        }];
    }
    

    我只是在没有Xcode协助的情况下输入,所以请原谅任何错别字,但希望它能说明这个想法。只需使用参数创建NSDictionary,然后将其传递给POST方法,而不使用constructingBodyWithBlock模式。


    请注意,上面包含一些细微的,无关的更改:

    1. 当您收到一个抱怨回复为text/html的错误对象时,您可能需要查看operation.responseString以查看该HTML的内容(如果有的话)。如果您的服务器在HTML响应中报告了一些错误,您可能想要阅读它所说的内容。请参阅上面错误块中的responseString日志记录。进入生产阶段时,您需要修改该错误处理块,但在此诊断阶段,请查看Web服务器返回的任何内容。

    2. 我将supprimerPhoto更改为void返回类型。如果您确实想要传回成功或失败信息,那么您将使用完成处理程序块参数,因此该方法可以异步地将成功/失败报告回调用例程。