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

标签 php ios objective-c xcode http

我目前有一个 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 进行破坏?

最佳答案

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

您的初始数据中的“+”字符在接收和存储时会变成“”。当您随后输出该值时,它是无效的 base64 编码数据。

如果您检查工作示例与非工作示例的来源,您会发现空格恰好存在于原始 Base64 编码值中有“+”的位置。您看到的任何换行符都是因为无论您查看源代码是在 ' ' 字符处换行。

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

编辑添加,以回应评论:

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

关于php - Base64 Over HTTP POST 丢失数据(Objective-C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802715/

相关文章:

php - 如何构建干 Twig 形式?

ios - 自从Xcode更新以来AudioToolBox不起作用

ios - 当侧边栏处于事件状态时防止 TableView 滚动

html - 如何在ios中的UITextview或UIView中显示HTML数据

ios - 在 iOS 中返回 Viewcontroller 时如何释放 nsmutablearray

ios - 如何摆脱数组中的多组括号

php - Doctrine DBAL 可以与 ORM Query Builder 混合使用吗?

php - html代码中的printf

php - 如何使用fileuploadfield extjs + php上传图片

ios - 为什么按钮图像会在用户点击后还原?