由于某种原因,我无法使用 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;
?>