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

Mat*_*ley 5 iphone cocoa-touch objective-c nsurlconnection nsurlrequest

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

我有一个Android应用程序使用相同的PHP代码,可以通过将图像转换为字节数组,然后使用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];

}     
Run Code Online (Sandbox Code Playgroud)

和接收图像的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;
Run Code Online (Sandbox Code Playgroud)

?>

Dim*_*my3 11

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

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

NSString* encodedImageString = [base64EncodedImage stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
Run Code Online (Sandbox Code Playgroud)

然后,而不是添加base64EncodedImagepostDict,你应该添加encodedImageString.

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

NSMutableDictionary *postDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 comments, @"comment",
                                 encodedImageString , @"image",
                                 nil];
Run Code Online (Sandbox Code Playgroud)

我认为这将解决问题,至少对我来说是这样.

干杯.


Har*_*nan 0

尝试更改内容类型。

[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
Run Code Online (Sandbox Code Playgroud)