出于某种原因,我无法使用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;
答案 0 :(得分:11)
嗯,当你问这个问题时已经有一段时间了,但是如果有人(像我一样)发现这个问题,这可能会有所帮助:
在Base64编码的图像中,您应该用“%”字符替换所有出现的“+”字符。翻译成代码,它将是:
NSString* encodedImageString = [base64EncodedImage stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
然后,您应该添加base64EncodedImage
,而不是在postDict
中添加encodedImageString
。
这样,你的postDict将如下所示:
NSMutableDictionary *postDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
comments, @"comment",
encodedImageString , @"image",
nil];
我认为这将解决问题,至少对我而言。
干杯。
答案 1 :(得分:2)
答案 2 :(得分:0)
尝试更改内容类型。
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];