5

何らかの理由で、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;

?>

4

3 に答える 3

11

さて、あなたがこの質問をしてからしばらく経ちましたが、誰か (私のような) がこの質問を見つけたら、これが役立つかもしれません:

Base64 でエンコードされた画像では、出現するすべての「+」文字を「%」文字に置き換える必要があります。コードに変換すると、次のようになります。

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

base64EncodedImage次に、 を追加する代わりに、 を追加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 に答える