2

http POST で画像を送信する方法と、現在のクライアント サーバー プロトコル設計を理解しようとしています。クライアントからサーバーへのすべてのメッセージは、次の例のようになります。コマンドには、パラメーターcmdといくつかのより関連するパラメーターを含む cmd 文字列があります。

たとえば、これはサーバーにテキストメッセージを送信する方法です:

- (void)sendMessagesWithText:(NSString *)text fromUser:(NSString *)userId
{
    NSString *url = SERVER_URL;

    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];

    NSMutableData *body = [NSMutableData data];

    [body appendData:[[NSString stringWithFormat:@"cmd=%@&userid=%@&msgtext=%@", 
                       @"sendmessage", 
                       userId,
                       text] dataUsingEncoding:NSUTF8StringEncoding]];


    [request setHTTPBody:body];

    // send to server
    [[NetworkHelper sharedManager] sendRequest:request]; 
}

ユーザーが画像も送信できるようにしたいのですが、プロトコル設計で画像を送信するにはどうすればよいですか? cmd文字列の後に画像を本文に追加するだけですか?

4

2 に答える 2

6

multipart/form-data で投稿する必要があります。

現在は機能していない ASI の例を次に示します。要求の作成と実行

ASIFormDataRequest によるフォーム POST の送信

Web ページのフォームと互換性のある方法で POST データを送信するには、含まれている ASIFormDataRequest サブクラスを使用します。バイナリ データまたはファイルをアップロードする場合、データは「application/x-www-form-urlencoded」形式、または「multipart/form-data」形式で投稿されます。ファイル内のデータは必要に応じてディスクから読み取られるため、Web サーバーがそれらを処理するように設定されている限り、大きなファイルの POST は問題ありません。

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];

ASIFormDataRequest は、setFile:forKey: 経由で POST に追加されたファイル (iOS 3.0 以降、Mac) の MIME タイプを自動検出し、サーバーに送信される MIME ヘッダーにこれを含めます。必要に応じて、長い形式を使用してこれをオーバーライドできます。


マルチパート/フォームデータは最悪です。私を信じてください、私は何年も前に C++ で実装しました。汚い仕事は他の人にやってもらいましょう。

それでも一人で行きたいなら。これこれを見つけました。幸運を。

于 2012-05-29T22:35:27.293 に答える
4

画像のNSDataバージョンをPOST本文に追加するだけです。

[body appendData:[[NSString stringWithFormat:@"cmd=%@&userid=%@&msgtext=%@", @"sendmessage&image=", userId, text] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData: UIImagePNGRepresentation((UIImage *) myImage)];

ただし、ASIHTTPRequestを調べる方が簡単な場合があります。これを使用すると、次のように使用できます。

[request setPostValue:myImageData forKey:@"image"];
于 2012-05-29T22:07:06.080 に答える