Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Base64 Over HTTP POST丢失数据(Objective-C)_Php_Ios_Objective C_Xcode_Http - Fatal编程技术网

Php Base64 Over HTTP POST丢失数据(Objective-C)

Php Base64 Over HTTP POST丢失数据(Objective-C),php,ios,objective-c,xcode,http,Php,Ios,Objective C,Xcode,Http,我目前有一个HTTP POST请求和一个Base64编码库,我将图像编码到B64,然后通过POST方法通过HTTP发送它 我将Base64输出到XCodes控制台,复制并粘贴它,它可以完美地工作。尽管数据库中存储的Base64 I(MongoDB、纯文本文件等)在另一端总是损坏 工作版本(从XCode复制和粘贴): 损坏的版本(来自MongoDB数据库): 如果查看源代码,您会注意到它们是相同的,但在损坏的版本中添加了空格 我使用的Objective-C代码是: MyImage.image =

我目前有一个HTTP POST请求和一个Base64编码库,我将图像编码到B64,然后通过POST方法通过HTTP发送它

我将Base64输出到XCodes控制台,复制并粘贴它,它可以完美地工作。尽管数据库中存储的Base64 I(MongoDB、纯文本文件等)在另一端总是损坏

工作版本(从XCode复制和粘贴): 损坏的版本(来自MongoDB数据库):

如果查看源代码,您会注意到它们是相同的,但在损坏的版本中添加了空格

我使用的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());
}
?>


我不知道为什么我会因为这篇文章而堕落?

这个问题正是我在第一次评论中提出的。也就是说,base64编码的数据可以包含“+”字符。在x-www-form-urlencoded数据中,接收方知道“+”是空格字符的编码。因此,由于您没有对base64值进行URL编码,“+”的任何实例在接收时都会导致数据损坏

接收和存储时,初始数据中的“+”字符将变为“”。然后输出该值时,它是无效的base64编码数据

如果检查工作示例和非工作示例的源代码,您将看到,在原始Base64编码值中有“+”的地方正好存在空格。您看到的任何新行都是因为您在中查看源代码的内容都是在“”字符处换行

在iOS代码中,您需要正确编码base64编码值,在您的情况下,您真正需要做的就是对“+”字符进行百分比编码

编辑以添加,以回应评论:

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

Base64编码数据可以包含“+”字符。在x-www-form-urlencoded数据中(正如我所期望的那样),接收者知道“+”是一个空格字符的编码。因此,由于您没有对base64值进行URL编码,“+”的任何实例在接收时都会导致数据损坏。这可能是你正在经历的,也可能不是你正在经历的,但你会在某个时候体验到。我认为问题在于PHP输出时的空白,我比较了working(直接从convert复制粘贴)和PHP的数据库版本,似乎PHP版本的源代码中有空白和换行符,这导致它崩溃,我已经尝试过在echo上使用trim(),但是没有任何可用性,您的$\u POST['picture']值是否与您从iOS应用程序中记录的值相同?另外,如果您认为问题是在PHP中输出值时,也许您应该在问题中包含该代码?它是相同的,但有空白,很多空白,我认为这是问题所在,我将以任何方式包含代码。我不认为您可以发布(或链接到?)正确数据的示例,还有带额外空格的数据?刚才使用
post=[post-stringByReplacingOccurrencesOfString:@“+”with-string:@“%”给出的