5

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

我有一个使用相同 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;

?>

4

3 回答 3

11

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

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

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

然后,而不是添加base64EncodedImagein postDict,您应该添加encodedImageString.

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

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

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

干杯。

于 2013-10-03T08:10:41.120 回答
3

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

在此处输入图像描述

于 2016-11-21T23:44:00.007 回答
0

尝试更改内容类型。

[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
于 2013-03-08T07:40:50.587 回答