Base64编码图像在传输到服务器期间损坏

时间:2013-03-08 05:08:22

标签: iphone objective-c cocoa-touch nsurlconnection nsurlrequest

出于某种原因,我无法使用NSURLRequest中的post方法将jpeg文件上传到服务器

我有一个使用相同php代码的Android应用程序,可以通过将图像转换为字节数组然后使用 base64 编码发送和接收来上传和下载图像。

我的iPhone应用程序下载图像正常,php脚本使用 base64 编码,我在我的iPhone应用程序中使用 base64 解码器,然后我将其转换为图像。这很好。

但是上传图片不起作用。

我将图片转换为 base64 编码的字符串(我为 base64 编码使用了几种不同的方法,它们都给出了相同的结果)然后我发布了到服务器,在服务器端解码并保存到服务器上的文件。

服务器上生成的解码文件是损坏的jpeg图像。损坏的文件大小是应有的字节数的3倍。

为上传生成的 base64 编码字符串与从服务器下载相同jpeg文件时生成的base64编码字符串也非常不同(即我使用ftp上传的有效图像文件服务)。

下面显示了我的代码以及用于接收图像的php脚本。

我相信转义字符会发生一些事情,导致 base64 字符串在传输过程中被破坏但无法解决。

为什么我的 base64 字符串在传输过程中被破坏了?

NSString* comments = @"comments to go with image";


NSData *data = UIImageJPEGRepresentation(_imageView.image, 1);
NSString *base64EncodedImage = [NSString base64StringFromData: data length: data.length];



//load the team posts so we know what items have been posted and what haven't
NSMutableDictionary *postDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 comments, @"comment",
                                 base64EncodedImage , @"image",
                                 nil];


NSMutableArray *parts = [[NSMutableArray alloc] init];
for (NSString *key in postDict) {
    NSString *part = [NSString stringWithFormat: @"%@=%@", key, [postDict objectForKey:key]];
    [parts addObject:part];
}

NSString *encodedDictionary = [parts componentsJoinedByString:@"&"];

NSData *postData = [encodedDictionary dataUsingEncoding:NSUTF8StringEncoding];

NSString* url = @"http://www.scroppohunt.com/upload.php";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (connection) {
    _data = [[NSMutableData data] init];

}     

和接收图像的php脚本

<?php


$comments = $_REQUEST['comment'];


//do some database stuff with the comments

////////////////////////////////////////
//save the file to the images folder
///////////////////////////////////////////

$base=$_REQUEST['image'];

if(strlen($base) > 0)
{

    // base64 encoded utf-8 string

    $binary=base64_decode($base);

    $file = fopen("postImages/test.jpg", 'wb');

    fwrite($file, $binary);

    fclose($file);
}

//display the bae64 encoded string taht was uploaded
echo $base;

&GT;

3 个答案:

答案 0 :(得分:11)

嗯,当你问这个问题时已经有一段时间了,但是如果有人(像我一样)发现这个问题,这可能会有所帮助:

在Base64编码的图像中,您应该用“%”字符替换所有出现的“+”字符。翻译成代码,它将是:

NSString* encodedImageString = [base64EncodedImage stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];

然后,您应该添加base64EncodedImage,而不是在postDict中添加encodedImageString

这样,你的postDict将如下所示:

NSMutableDictionary *postDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 comments, @"comment",
                                 encodedImageString , @"image",
                                 nil];

我认为这将解决问题,至少对我而言。

干杯。

答案 1 :(得分:2)

我也有这个问题。对我来说,发生的事情是所有的“+”在被发送到服务器后被“空格”取代。没有其他这样的腐败:

enter image description here

答案 2 :(得分:0)

尝试更改内容类型。

[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];