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)
然后,而不是添加base64EncodedImage在postDict,你应该添加encodedImageString.
这样,你的postDict将如下所示:
NSMutableDictionary *postDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
comments, @"comment",
encodedImageString , @"image",
nil];
Run Code Online (Sandbox Code Playgroud)
我认为这将解决问题,至少对我来说是这样.
干杯.
尝试更改内容类型。
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
Run Code Online (Sandbox Code Playgroud)