Springboot はマルチパート サーブレット リクエストの解析に失敗しました。ネストされた例外は java.lang.IllegalStateE です

今日、Springboot アップロード関数の開発中にエラーが発生しました: マルチパート サーブレット リクエストの解析に失敗しました; ネストされた例外は java.lang.IllegalStateException: マルチパート リクエストには、最大許容制限を超えるパラメータ データ (アップロードされたファイルを除く) が含まれていました。私がこの問題をどのように解決したかを共有しましょう。

まず、application.properties を変更しました。そこに次の構成を追加します。

spring.servlet.multipart.max-file-size = 50MB
spring.servlet.multipart.max-request-size = 50MB

ここでの値は、50MB を例として、実際のニーズに応じて調整できます。このようにして、許可されるアップロード ファイルの最大サイズを 50MB に設定し、最大リクエスト サイズを 50MB に制限します。

次に、コントローラーでリクエスト マッピング関数も変更し、次の形式に変更する必要があります。

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {
    // 处理上传文件的逻辑
}

ここではコンテンツ タイプを multipart/form-data として指定する必要があることに注意してください。指定しないとエラーが発生します。

それでもエラーが発生する場合は、一度に大きなファイルをアップロードする際の問題を回避するために、アップロードを 1 つのリクエストに制限し、ファイルを分割してアップロードして処理することを試みることができます。以下に実装例を示します。

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) throws IOException {
    // 设置缓冲区大小为100KB
    int bufferSize = 102400;
    byte[] buffer = new byte[bufferSize];
    InputStream inputStream = file.getInputStream();
    while (true) {
        int bytesRead = inputStream.read(buffer, 0, bufferSize);
        if (bytesRead <= 0) {
            break;
        }
        // 处理上传文件的逻辑
    }
    inputStream.close();
    return ResponseEntity.ok("Upload successful");
}

以上がマルチパートサーブレットリクエストの解析に失敗したエラーを解決する方法です。

上記のメソッドに加えて、Springboot で @ControllerAdvice と @ExceptionHandler を使用して、ファイルのアップロード時に発生する例外をキャッチして処理することもできます。

まず、ControllerAdvice で例外処理メソッドを定義する必要があります。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ResponseEntity<String> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        return ResponseEntity.status(HttpStatus.PAYLOAD_TOO_LARGE).body("File size exceeds the limit");
    }

    // 其他异常处理方法
    // ...
}

ここでは、MaxUploadSizeExceededException 例外処理メソッドを定義します。これは、アップロードされたファイル サイズが制限を超えると、PAYLOAD_TOO_LARGE ステータス コードを返し、「ファイル サイズが制限を超えています」というエラー メッセージを返すことを意味します。

次に、コントローラーで次の例外処理メソッドを使用できます。

@PostMapping("/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {
    try {
        // 处理上传文件的逻辑
    } catch (MaxUploadSizeExceededException e) {
        throw e;
    } catch (Exception e) {
        // 其他异常处理
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal server error");
    }
    return ResponseEntity.ok("Upload successful");
}

catch ステートメントで MaxUploadSizeExceededException 例外をキャッチし、ControllerAdvice が処理できるように throw ステートメントを使用して例外をスローする必要があることに注意してください。同時に、他の考えられる例外をキャッチし、それに応じて処理する必要もあります。

上記は、Springboot でファイルをアップロードするときに発生するマルチパート サーブレット リクエストの解析に失敗したエラーを解決する方法について共有したものです。

おすすめ

転載: blog.csdn.net/javamendou/article/details/131361702