BASE64在HTTP POST丢失数据(目标C)(Base64 Over HTTP POST lo

2019-07-19 16:36发布

我现在有一个HTTP POST请求和base64编码库,我编码我到B64图像,然后通过POST方法把它通过HTTP。

我输出的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是腐败?

Answer 1:

这个问题正是我在我的第一个评论建议。 也就是说,base64编码数据可以包含“+”字符。 在X WWW的窗体-urlencoded数据接收方知道“+”是一个空格字符的编码。 因此,因为你没有URL编码的base64你的价值,“+”任何情况下会导致接收时被损坏的数据。

在初始数据的“+”字符变成“接收和存储时”。 当你再输出值,则编码数据无效的base64。

如果你检查你的工作与非工作示例的源,你会看到空白存在于原始Base64编码值完全那里是一个“+”。 任何你看到的换行符是因为无论你在“”字符被包装线查看源代码。

在您的iOS的代码,你需要正确编码编码值中的Base64,你的情况你真正需要做的是百分之编码的“+”字符。

编辑添加的,在回应评论:

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


文章来源: Base64 Over HTTP POST losing data (Objective-C)