使用 afnetworking 删除照片

Posted

技术标签:

【中文标题】使用 afnetworking 删除照片【英文标题】:delete a photo with afnetworking 【发布时间】:2015-04-05 12:53:13 【问题描述】:

我在目标 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 但如果您有建议会很好。

【问题讨论】:

将错误级别设置为 E_ALL,display_errors 设置为 true,并记录服务器响应,它可能会为您提供足够的信息来调试问题。 是的 Rob,我只想发送要删除的文件的名称。我怎样才能以简单的方式使用 Post?也许我可以在没有 AFNetworking 的情况下做到这一点? 顺便说一句,PHP 代码中似乎有一个额外的unlink。我怀疑您在试验服务器代码时已经完成了,但这是不正确的。在检查文件是否存在之前删除您所做的unlink 【参考方案1】:

您的 PHP 有两个错误:

    你拼错了error_reporting

    header() 后面缺少分号。

您可能应该返回一些 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 并将其传递给不带 constructingBodyWithBlock 模式的 POST 方法。


请注意,以上内容包括一些无关紧要的小改动:

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

    我将 supprimerPhoto 更改为 void 返回类型。如果您真的想传回成功或失败信息,您可以使用完成处理程序块参数,以便此方法可以将成功/失败异步报告回调用例程。

【讨论】:

响应为空。我该怎么做才能查看 Web 服务器返回的内容? 我刚刚用 php 文件、代码和调试错误更新了我的问题。我将 _REQUEST 替换为 _POST 并将 header('Content-type: application/json') 放入。 关于我的请求,我的 php 文件的正确路径只是“URL_DELETE_PHOTO”:@"xxxxxx.fr/DeletePhoto.php" @pourpre 我怀疑是这样的。请参阅有关 PHP 代码中的几个错误的修订答案以及 AFNetworking 如何解析响应的示例。 好的,我要去看看这种方式有什么问题。谢谢你的帮助;)

以上是关于使用 afnetworking 删除照片的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 与 iOS 4.3 不兼容

使用GCD中的dispatch_semaphore(信号量)处理一个界面多个请求(把握AFNet网络请求完成的正确时机)

使用 AFNetworking 和 PHP 从照片库上传选定的图像

使用 AFNetworking 从 ios 中的照片库上传图像?

从网络下载图像到照片应用程序 AFNetworking 3

使用 AFNetworking 2.0 加载图像