2

アップロード ファイルに問題があります。Objective-C から Java にファイルを送信しています。

サーバ側:

logger は tomcat に表示されません。

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody MessageWrapper getMessage(@RequestBody MessageWrapper msg,  @RequestParam("photo") MultipartFile file) throws Exception {
logger.info("Send");
/*
    my code
*/

return msg;
}

クライアント側:

__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

[request setData:message.imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];

NSArray *toEmail = [message.to componentsSeparatedByString:@","];
NSArray *objects = [NSArray arrayWithObjects:toEmail, message.subject, message.content, nil];
NSArray *keys = [NSArray arrayWithObjects:@"to", @"subject", @"body", nil];

NSDictionary *msgDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
NSString *jsonRequest = [msgDict JSONRepresentation];
NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]];
[request setRequestMethod:@"POST"];
[request setUseCookiePersistence:NO];
[request addRequestHeader:@"Content-type" value:@"application/json"];
[request setRequestCookies:[NSMutableArray arrayWithObject:[self setKidCookieParams]]];
[request setDelegate:self];
[request setPostBody:[[NSMutableData alloc] initWithData:requestData]];
[request startAsynchronous];

次の行がなくても、正しく機能します。

[request setData:message.imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];
and server side like  this:
@RequestMapping(method = RequestMethod.POST)
 public @ResponseBody MessageWrapper sendMessage(@RequestBody MessageWrapper msg) throws Exception {
    logger.info("Send");
    /*
        my code
    */

  return msg;
 }

私を助けてください。前もって感謝します!

4

1 に答える 1

2

あなたの問題は、@RequestBody(完全なリクエスト本文を消費すると想定されている)と@RequestParam(ファイルデータを表すと想定されているため、リクエスト本文の一部になる)を混在させることです。リクエスト本文を 1 つのアイテムで完全に消費し、その一部を別のパラメーターとして渡すことはできません。Objective-C 側でも同様に、まずphotoリクエスト本文にパラメータを追加してから、本文全体を で上書きしますsetPostBody:

MessageWrapper msg代わりに、サーバー側で を別の として宣言する必要があり@RequestParam、JSONDeserializer がそれを適切に取得することを願っています。そうでない場合は、まず使用@RequestParam String msgして、少なくとも JSON 文字列値が到着するかどうかを確認してから、逆シリアル化が機能するようにしてください。

次に、Objective-C 部分も更新する必要があります。私は Objective-C にあまり詳しくありませんが[request setPostBody:[[NSMutableData alloc] initWithData:requestData]];、JSON 部分をこの multipart-fileupload の別のパラメータとして追加する必要がある代わりに、リクエスト ヘッダーContent-Typeをにする必要があると感じて multipart/form-dataいます。 .

この SO の質問: http file upload Objective C http://cocoadev.com/wiki/HTTPFileUpload へのポインターが見つかりまし た。辞書「名前」->「値」、「値」は文字列またはファイルのいずれかであり、目的に合わせて調整できる場合があります。この例では、完全なリクエスト ボディを手動で作成しています。よくわかりませんが、Objective-C にはもっと便利なオプションがあると思います。

たとえば、次のようなものを呼び出すだけでうまくいくのだろうかと思います[request addData:requestData forKey:@"msg"]が、ここにはObjective-C環境がないため、テストされていません。

http ファイルのアップロードの舞台裏で何が起こっているかを本当に知りたい場合 (プログラミングが簡単になることを理解してください)、ファイルのアップロードに関するRFC 1867を読んでください(ここでは HTML 部分を無視して、リクエスト本文がどのように表示されるかを見てください)。がまとめられている)、または簡単な例については、たとえばhereまたはhereを参照してください。

于 2013-02-16T13:03:15.520 に答える