何らかの理由で、postメソッドを使用してjpegファイルをサーバーにアップロードできませんNSURLRequest
同じphpコードを使用するAndroidアプリがあり、画像をバイト配列に変換し、 base64エンコーディングを使用して送受信することで画像を正常にアップロードおよびダウンロードできます。
私のiPhoneアプリは画像を正常にダウンロードします。phpスクリプトはbase64を使用してエンコードし、iPhoneアプリでbase64デコーダーを使用して画像に変換します。これは正常に機能します。
ただし、画像のアップロードは機能しません。
画像をbase64でエンコードされた文字列に変換し( base64エンコードにいくつかの異なる方法を使用しましたが、すべて同じ結果になります)、サーバーに投稿し、サーバー側でデコードして、サーバー上のファイルに保存します。
サーバー上で結果としてデコードされたファイルは、破損したjpegイメージです。破損したファイルサイズは、本来あるべきバイト数の3倍です。
アップロード用に生成されたbase64エンコード文字列は、サーバーから同じjpegファイル(つまり、ftpサービスを使用してアップロードした有効なイメージファイル)をダウンロードしたときに生成されたbase64エンコード文字列とも大きく異なります。
私のコードは、画像を受け取るための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;
?>