web-dev-qa-db-ja.com

Spring File Upload-「必要なリクエストパーツが存在しません」

POST要求をコントローラーに送信しようとしていますが、JSONを使用することを決定しない限り、どのタイプのパラメーターも渡すことはできません。目標はストリングとファイルをコントローラーに渡すことですが取得 Required request part 'xxx' is not presentエラー。

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("file") MultipartFile uploadfile){
        return ResponseEntity.ok().body(null);
    }
}

ここにファイルがありません。同様に私が試してみると:

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("name") String name){
        return ResponseEntity.ok().body(null);
    }
}

ここで名前を得ることができないのと同じこと。

次のスクリーンショットにあるように、Postman経由でリクエストを送信しています。

Postman Request

Postman Request 2

唯一のヘッダータグは承認用です。 Content-Typeヘッダーがありません。multipart/form-dataしかし、助けにはならなかった。

Stringパラメーターを渡すことができる唯一の方法は、URLに追加することです。したがって、http://localhost:8080/SearchBox/admin/config?name=testは動作しますが、これは私が望むものではありません。ボディパーツに文字列とファイルのパラメーターが必要です。

私もCURL経由でテストしました:

curl -X POST -H "Authorization:Bearer myToken" -H "Content-Type:Multipart/form-data" http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -X POST -H "Authorization:Bearer myToken"http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -H "Authorization:Bearer myToken" -F file=@"/g123.conf" http://localhost:8080/SearchBox/admin/config

注:私はすでに同様の投稿をチェックしましたが、助けにはなりませんでした ThisThisこれ

8

私は最終的に問題を解決し、他の誰かが同じ問題に直面する可能性がある場合にソリューションを共有しました。

@RestController
@RequestMapping("/")
public class ConfigurationController {

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        return new MultipartConfigElement("");
    }

    @Bean
    public MultipartResolver multipartResolver() {
        org.springframework.web.multipart.commons.CommonsMultipartResolver multipartResolver = new org.springframework.web.multipart.commons.CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(1000000);
        return multipartResolver;
    }
    @PostMapping(value = "/config", consumes = "multipart/form-data")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("password") String password, @RequestParam("file") MultipartFile submissions)
            throws AdminAuthenticationException, ConfigurationException {
        return ResponseEntity.ok().body(null);
    }
}
11
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<?> upload(@RequestParam(value = "name") String 
name,@RequestParam(value = "file") MultipartFile file){
    // TODO check file is not null and save 
    return new ResponseEntity<>(HttpStatus.valueOf(200));;
}

enter image description here

2
baba

Beanを構成ファイルに追加します。

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(-1);
    return multipartResolver;

}
2
Mahendra Sri

主な理由は@RequestParam( "file")であり、代わりに@RequestBodyがあるはずだと思います。

1

私の場合、ソリューションには構成で「@EnableWebMvc」注釈がありませんでした

@EnableWebMvc
@Configuration
internal class BulkOffersUploadConfig {

    @Bean
    fun multipartResolver(): MultipartResolver {
        val multipartResolver = CommonsMultipartResolver()
        multipartResolver.setMaxUploadSize(1000)
        multipartResolver.setMaxUploadSizePerFile(1000)
        return multipartResolver
    }
}
0
Aik

これは元のポスターの問題ではありませんでしたが、この質問が見つかり、上記の解決策がどれも役に立たない場合は、Postmanヘッダーを確認してください。 「Content-Type」ヘッダーが設定されている場合、上記のエラーが発生する可能性があります。

「Content-Type」ヘッダーを削除すると、上記の問題が解決する場合があります。

詳細については、次の質問を参照してください。

郵便配達員:必要なリクエストパーツ「ファイル」が存在しません

0
drew

また、プロキシまたはマルチパート/フォームデータまたはオクテットストリームコンテンツタイプをサポートしていない可能性のある他の仲介者を経由する場合、リクエスト本文がサーバーに到達しない可能性も考慮してください。うまくいけば、この種のリクエストを機能させるための追加設定でこれを解決できることを願っています。また、コントローラーの前後にリクエストを記録できるようにリクエストインターセプターを構成することをお勧めします。これにより、リクエストパラメーター、ペイロード、ヘッダーを覗くことができます。私の場合、リクエスト本文のサイズが0であることがわかりました。これは、このエラーの原因が私のスプリング構成ではないことを検出するのに役立ちます。 ここ Springがすぐに使用できるロギングインターセプターを支援する有用なリソースを残します。 ここにリンクの説明を入力

0
darkconeja