Вызван сбой блока AFNetworking 2.0 POST + PHP, хотя загрузка прошла успешно

Описание моей проблемы на самом деле находится в шапке вопроса. Я новичок в веб-технологиях, поэтому такое поведение для меня немного бросается в глаза. Почему вызывается блокировка отказа, хотя загрузка изображения успешно завершена? Более того, я искал ответ на свой вопрос в SoF и применял некоторые решения, но эта ошибка все еще появляется. Пожалуйста, помогите, если это возможно. Заранее спасибо.

ЦЕЛЬ - С:

- (void)upload {

    NSString *fileName = [NSString stringWithFormat:@"%ld%c%c.jpg", (long)[[NSDate date] timeIntervalSince1970], arc4random_uniform(26) + 'a', arc4random_uniform(26) + 'a'];
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"jpg"];
    NSData *data = UIImagePNGRepresentation([UIImage imageWithContentsOfFile:imagePath]);

    NSString *URLString = @"http://myServer/myAppFolder";

    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager manager] initWithBaseURL:[NSURL URLWithString:URLString]];

    AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
    [manager setResponseSerializer:responseSerializer];
    [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];

    AFHTTPRequestOperation *operation = [manager POST:@"upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileData:data name:@"uploadedfile" fileName:fileName mimeType:@"image/jpeg"];
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Success %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Failure / %@, /  %@", error, operation.responseString); //error comes from here
    }];

    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
        NSLog(@"uploading...");
    }];
}

загрузить.php:

<?php
$filename="uploaded";
$target_path = "uploads/";

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['uploadedfile']['name'])." has been uploaded";
} else {
    echo "There was an error uploading the file, please try again!";
}
?>;

Я получаю эту ошибку:

Failure / Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x8a633e0 {NSDebugDescription=Invalid value around character 0.}, /  The file 1389046572lb.jpg has been uploaded;

person Neru    schedule 06.01.2014    source источник
comment
Не кодировщик ios, но недопустимое значение вокруг символа 0 для вашего сообщения The file ... предполагает, что какао ожидает какой-то ДРУГОЙ текст, который вы не отправляете.   -  person Marc B    schedule 07.01.2014
comment
Почему вы используете AFJSONResponseSerializer? Ваш PHP не возвращает JSON... Попробуйте с [AFResponseSerializer serializer]...   -  person Rok Jarc    schedule 07.01.2014
comment
Я попытался повторить JSON, созданный json_encode, в моем файле .php. Но была ошибка про мусор в конце. Я понял, что в сериализаторе может быть проблема, хотя не знал о AFHTTPResponseSerializer, который на самом деле является ответом. Спасибо rokjarc за осуждение меня! Также спасибо Марку за ответ :-)   -  person Neru    schedule 07.01.2014
comment
Пожалуйста. Я вижу, что вы решили это, пока я печатал свой ответ :)   -  person Rok Jarc    schedule 07.01.2014
comment
Действительно rokjarc :-) Ура!   -  person Neru    schedule 07.01.2014


Ответы (1)


Похоже, проблема в том, что вы используете AFJSONResponseSerializer для сериализации ответа вашего скрипта загрузки PHP.

И ваш PHP не возвращает JSON, поэтому сериализатор выдает ошибку.

Вы можете либо изменить PHP-скрипт, чтобы он возвращал результат в формате JSON. Или вы можете использовать другой тип сериализатора.

Согласно этому форуму, решением будет использование [AFResponseSerializer serializer] - я не уверен, что это даже существуют. Попробуйте базовый AFHTTPResponseSerializer.

person Rok Jarc    schedule 06.01.2014