удалить фото с помощью сети

У меня проблема с удалением фотографии с помощью AFNetworking в объективе C.
Вот мой объективный код 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, но если у вас есть предложения, это было бы хорошо.

0

Решение

В вашем PHP есть две ошибки:

  1. Вы ошиблись error_reporting,

  2. Вы пропустили точку с запятой после 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 с параметрами и передать это POST метод без constructingBodyWithBlock шаблон.


Обратите внимание, что вышеизложенное включает в себя несколько незначительных, не связанных изменений:

  1. Когда вы получаете объект ошибки, который жалуется, что ответ был text/htmlвы можете посмотреть на operation.responseString чтобы увидеть, что было содержимое этого HTML (если что). Если ваш сервер сообщил об ошибке в HTML-ответе, вы можете прочитать его. Смотрите журнал responseString в блоке ошибок выше. Когда вы приступите к работе, вы захотите пересмотреть этот блок обработки ошибок, но на этом этапе диагностики посмотрите, что вернул веб-сервер.

  2. Я изменился supprimerPhoto к void тип возврата. Если вы действительно хотите передать информацию об успехе или неудаче, вы должны использовать параметр блока обработчика завершения, чтобы этот метод мог асинхронно сообщать об успехе / неудаче вызывающей подпрограмме.

0

Другие решения

Других решений пока нет …