Преобразование строки в формате responseObject base64 в UIImage

1

Я пытаюсь отправить изображение с PHP (на стороне сервера) в мое приложение iOS, чтобы я мог отображать его в UIImageView.

Код моей серверной части:

<?php

header("Content-Type: image/jpeg"); //if your data is format jpeg

$username = $_POST['username'];
$count = $_POST['count'];
$base64string =     base64_encode(file_get_contents("images/".$username."/".$count."/".$username."file".$count.".jpeg"));
echo $base64string;

?>

Я получаю изображение с этим кодом в приложении iOS:

NSString * uploadURL = @"http://192.168.1.4/getimage.php";

NSLog(@"uploadImageURL: %@", uploadURL);

NSString *queryStringss = [NSString stringWithFormat:@"%@", uploadURL];
                queryStringss = [queryStringss stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer=[AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/plain"];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"image/jpeg"];

NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];

NSString *usernameEncoded = [marker.title stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSDictionary *params = @{@"username": usernameEncoded, @"count": [object valueForKey:@"count"]};

[manager POST:queryStringss parameters:params success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
       NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject);
       NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:responseObject options:0];
       image.image = [UIImage imageWithData:decodedData scale:300/2448];
           [self.view addSubview:image];
       }
   failure:^(AFHTTPRequestOperation *operation, NSError *error) {
       NSLog(@"Error: %@ ***** %@", operation.responseString, error);
   }];

Когда я запускаю код - он попадает в блок сбоя с ошибкой, которая читается как кодированная "строка" (изображение), кодируемая base64, которую я отправляю:

2015-12-03 01:19:15.655 sneek[6261:1952572] Error: /9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAYAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAMwKADAAQAAAABAAAJkAAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgJkAzAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tr

... (very long) ...

Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}

Что я делаю неправильно?

Теги:
uiimageview
uiimage

1 ответ

1
Лучший ответ

Вы указали AFJSONResponseSerializer хотя это не JSON. Конечно, вы переопределили acceptableContentTypes типыContentTypes, но это не мешает ему анализировать JSON в ответе.

Я бы использовал AFHTTPResponseSerializer а затем потерял acceptableContentTypes AFHTTPResponseSerializer.

Кстати, я бы не использовал image/jpeg для ответа на base64-кодировку, потому что это текст, а не jpeg. Если вы собираетесь вернуть исходную base64-строку, вы можете использовать application/text или что-то в этом роде.

Или, лучше, измените свой PHP, чтобы на самом деле вернуть JSON (потому что это упростит анализ ответа), и оставайтесь с AFJSONResponseSerializer (но потеряйте acceptableContentTypes после исправления заголовка), а затем вы можете захватить строку base64 из response[@"image"].

<?php

header("Content-Type: application/json");

$username = $_POST['username'];
$count = $_POST['count'];
$base64string =     base64_encode(file_get_contents("images/".$username."/".$count."/".$username."file".$count.".jpeg"));
echo json_encode(array("image" => $base64string));

?>

Или используйте AFImageResponseSerializer и измените PHP, чтобы вернуть изображение:

<?php

header("Content-Type: image/jpeg"); //if your data is format jpeg

$username = $_POST['username'];
$count = $_POST['count'];
$contents = file_get_contents("images/".$username."/".$count."/".$username."file".$count.".jpeg"));
echo $contents;

?>
  • 0
    спасибо, что попробовал ваше второе предложение сейчас ... не был уверен, как реализовать ваше первое предложение на стороне iOS.
  • 1
    Подход JSON? Затем вы можете получить строку base64 с response["image"] и затем декодировать ее.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню