Base64 Потерять данные HTTP POST (Objective-C) - программирование
Подтвердить что ты не робот

Base64 Потерять данные HTTP POST (Objective-C)

В настоящее время у меня есть HTTP POST Request и Base64 Encoding Library, я кодирую свое изображение на B64, затем отправляю его через HTTP через метод POST.

Я выводил консоль Base64 в XCodes, копировал и вставлял ее, и она отлично работает. Хотя Base64, хранящийся в базе данных (MongoDB, обычный текстовый файл и т.д.), Всегда выходит из строя на другом конце.

Рабочая версия (скопирована и вставлена ​​с XCode): http://dontpanicrabbit.com/api/working.php Сломанная версия (из базы данных MongoDB): http://dontpanicrabbit.com/api/grabimage.php

Если вы просмотрите исходный код, вы заметите, что они одинаковы, но в сломанную версию добавлен пробел.

Используемый мной код Objective-C:

MyImage.image = [info objectForKey:UIImagePickerControllerOriginalImage];

    NSData *imageData = UIImageJPEGRepresentation(MyImage.image, 0);

    [Base64 initialize];
    NSString *encoded = [Base64 encode:imageData];

    NSString *urlPOST = encoded;
    //NSLog(@"%@",encoded);

    NSString *varyingString1 = @"picture=";
    NSString *varyingString2 = urlPOST;
    NSString *post = [NSString stringWithFormat: @"%@%@", varyingString1, varyingString2];
    NSLog(@"%@", post);
    //NSString *post = @"image=%@",urlPOST;
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:@"url/api/insertimage.php"]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:postData];
    NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];
    NSString *strResult = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

PHP → хранилище MongoDB

<?php
    try {
      // open connection to MongoDB server
      $conn = new Mongo('localhost');

      // access database
      $db = $conn->dablia;

      // access collection
      $collection = $db->images;

      // insert a new document
      $item = array(
        'picture' => $_POST['picture']
      );
      $collection->insert($item);
      echo 'Inserted document with ID: ' . $item['_id'];

      // disconnect from server
      $conn->close();
    } catch (MongoConnectionException $e) {
      die('Error connecting to MongoDB server');
    } catch (MongoException $e) {
      die('Error: ' . $e->getMessage());
    }
?>

Код выхода:

<?php
try {
  // open connection to MongoDB server
  $conn = new Mongo('localhost');

  // access database
  $db = $conn->dablia;

  // access collection
  $collection = $db->images;

  // execute query
  // retrieve all documents
  $cursor = $collection->find();

  // iterate through the result set
  // print each document
  foreach ($cursor as $obj) {
    echo '<img src="data:image/jpeg;base64,'.trim($obj['picture']).'">';
  }

  // disconnect from server
  $conn->close();
} catch (MongoConnectionException $e) {
  die('Error connecting to MongoDB server');
} catch (MongoException $e) {
  die('Error: ' . $e->getMessage());
}
?>

Я понятия не имею, почему я, кажется, искажаю POST?

4b9b3361

Ответ 1

Проблема в том, что я предложил в своем первом комментарии. То есть данные, закодированные в base64, могут содержать символы "+" . В данных x-www-form-urlencoded приемник знает, что "+" является кодировкой символа пробела. Таким образом, поскольку вы не кодируете URL-адрес вашего значения base64, любые экземпляры "+" могут привести к повреждению данных при их получении.

Символы '+' в ваших исходных данных превращаются в '' при их получении и хранении. Когда вы выведете это значение, это недопустимые данные с кодировкой base64.

Если вы изучите источник своих рабочих и нерабочих примеров, вы увидите, что пробел существует ТОЧНО, где есть "+" в исходном кодированном значении Base64. Любые новые строки, которые вы видите, связаны с тем, что все, что вы просматриваете в источнике, это обертывание строк символом '.

В вашем коде iOS вам необходимо правильно закодировать кодированное значение base64, в вашем случае все, что вам действительно нужно сделать, это процент кодирования символов "+" .

EDIT добавить в ответ на комментарий:

post = [post stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];