3

NSMutableURLRequest を使用したポスト リクエストの一部として、base64 でエンコードされた画像をサーバーに送信しています。投稿本文として記録するものとサーバーが受け取るものは同じではありません。サーバーは、接続が途中で中止されたかのように、切り捨てられたバージョンを取得しているようです。以下のコードを参照してください。

NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",reqStr];
NSLog(@"datastr is %@",dataStr);
NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"nsdata length is: %i",[dataForUrl length]);
[urlRequest setHTTPBody:dataForUrl];
[urlRequest setValue:[NSString stringWithFormat:@"%d", [dataForUrl length]] forHTTPHeaderField:@"Content-Length"];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *res, NSData *data, NSError *err) {
    // ... 
}

最初のログ ステートメントは、正しいデータを示しています。文字列の base64 部分をhttp://www.motobit.com/util/base64-decoder-encoder.aspに取り、jpg としてデコードしたところ、正しい画像になりました。2 番目のログ ステートメントは、長さが適切なサイズであることを示しています (たとえば、写真が 422480 の場合、422624)。

接続の詳細やデータに問題はありません。電話が接続を確立し、データを送信すると、電話が送信を停止するか、サーバーが受信を停止します。何が原因でしょうか?

編集: サンプル データへのリンクhttp://pastebin.com/BS9HjKhg

Edit2: サーバーまたは iOS が画像の + をスペースに変換しています。正しい送信方法がわかったら、回答を投稿します。

4

2 に答える 2

4

サーバーからの完全なサンプルとxcodeがログに記録したものを比較することができ+[space]. それが問題を抱えている唯一の文字であり、iOSではURLエンコーディングにバグがあるため、私はただやりました

NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",[reqStr stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]];

サーバーはそれらを再び受け入れています。サーバーが問題だったのか、iOS だったのかはまだわかりません。接続する他の OS は、コンテンツ タイプとして同じ application/x-www-form-urlencoded を問題なく使用します。

于 2013-01-14T20:38:40.000 に答える
1

Base64 文字列からNick Lockwood の Base64 classNSDataを介して変換することをお勧めします。

それか

NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

少し心配です(Base64が変換を実装する方法を見た後はさらに)...

于 2013-01-14T18:17:58.450 に答える