4

この Web サービス コードに問題があります

@Controller
@RequestMapping("/u_tutorial")
public class UploadTutorial
{
    @RequestMapping(value = "tutorial1", method = RequestMethod.POST, headers = "Accept=application/json")
    @ResponseStatus(value = HttpStatus.OK)
    public void upload(@RequestBody String body, @RequestParam List<MultipartFile> file, Principal principal,
        HttpServletRequest request)
    {
        System.out.println("body: " + body); // always empty

        for (MultipartFile mf : file)
        {
            System.out.println("file: " + mf.getOriginalFilename());
        }
    }
}

状況は、リクエスト本文にいくつかのデータを含むファイルをアップロードしたい場合で、body 変数は常に空の文字列を返します。

しかし、「@RequestBody String body」または「@RequestParam List file」のみを使用しようとすると、魅力的に機能します。

検索を行ったところ、InputStream の問題が原因であることがわかりました。いくつかの提案された解決策はすでに議論されていますが、私の問題とはあまり関係がありません (または、そうかもしれませんが、私にはわかりません)。

誰でも私に解決策を教えてもらえますか? どうも。

PS 1.これが私のライブラリバージョンです

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.core.version>3.1.4.RELEASE</spring.core.version>
    <spring.security.version>3.1.3.RELEASE</spring.security.version>
    <spring.data.mongodb.version>1.1.0.RELEASE</spring.data.mongodb.version>
    <cglib.version>2.2</cglib.version>
    <aspectj.version>1.6.10</aspectj.version>
    <mongodb.driver.version>2.10.1</mongodb.driver.version>
    <!-- Logging -->
    <slf4j.version>1.6.1</slf4j.version>
    <log4j.version>1.2.14</log4j.version>
    <javax.jstl-taglibs.version>1.1.2</javax.jstl-taglibs.version>
    <jackson.version>1.9.3</jackson.version>
    <!-- Testing -->
    <mockito.version>1.8.5</mockito.version>
    <junit.version>4.8.2</junit.version>
    <!-- Plugins -->
    <maven.copy.plugin.version>0.2.3</maven.copy.plugin.version>
    <maven.compiler.plugin.version>2.3.2</maven.compiler.plugin.version>
    <maven.apt.plugin.version>1.0</maven.apt.plugin.version>
    <!-- Utilities -->
    <apache.common.io.version>2.4</apache.common.io.version>
    <apache.common.fileupload.version>1.2.2</apache.common.fileupload.version>
    <jodatime.version>2.1</jodatime.version>
</properties>

PS 2.私の英語でごめんなさい。

4

2 に答える 2

4

「body」文字列をフォームの非表示フィールドにして、個別の@RequestBodyパラメーターとしてではなく、別の@RequestParamとして投稿することができます。したがって、フォームは次のようになります。

<form id="myForm" method="post" enctype="multipart/form-data">
    <input type="hidden" name="body" value="bodyValue"/>
    <input type="file" name="file"/>
    ...

コントローラは次のようになります。

public void upload(@RequestParam String body, @RequestParam List<MultipartFile> file, Principal principal, HttpServletRequest request)
....
于 2013-03-19T15:59:37.443 に答える
0

私は自分の質問について別の観点から考えるようになり、クライアントがファイルのアップロードとデータの送信を@RequestBody同時に行うことができない可能性があることに気付きました。

それで、私は WireShark でリクエストをキャッチし始めました。結果は思った通りでした。データがありません。リクエストに残っているのはファイルだけです。

参照:ファイルおよび関連データを RESTful WebService に投稿する (できれば JSON として)

解決策は、Web サービス サーバーのメソッドを再構築することかもしれません。

THX。

于 2013-03-20T04:38:25.870 に答える