ゴシップ
私はこのメモを書き、ある大物から抜粋した一節をお届けします(誰なのか思い出せません、ハハハ)。
見つけるのが最も難しいバグは、多くの場合、最も低レベルのエラーです。
この一節は、トラブルシューティングを行って問題の原因を分析する学習段階で常に非常に役立ちました。
文章
序文
個人的なプロジェクト開発では、ファイルのアップロード、削除、ダウンロードの機能を完了する必要があります。これは簡単なことのはずですが、長い間妨げられ、プロジェクトの進行が遅くなっていました。もちろん、最近いろいろあったからですが、外的なものは言い訳になりません。。さて、おしゃべりはこれくらいにして、最初にいくつか質問を投稿しましょう。
質問
問題 1: 要求されたファイル サイズがデフォルトの制限を超えています
1つ目はファイルサイズの問題で、 springbootプロジェクトでMaxUploadSizeExceptionが発生しました。Springboot のデフォルトのアップロード ファイル サイズ制限は 1MB で、デフォルトの単一リクエスト サイズ制限は 10MB です。サイズを超えると、上記の例外がスローされます。要求されたファイル サイズが 1MB を超える場合と 10MB を超える場合の例外は異なります。
1MBを超える場合の例外情報
Resolved [org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.]
10MBを超える場合の例外情報
Resolved [org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (12209424) exceeds the configured maximum (10485760)]
ファイルが 10MB を超えると、プロジェクトはエラーを報告しますが、この例外はカスタム グローバル例外ハンドラー @ControllerAdvice ではキャッチできず、ページは直接 500 を報告します。
理由
以下の図はSpringMVCのシングルリクエスト応答処理です。
この図は、コントローラーで例外をキャッチできない理由を説明しています。これは、最初の 2 つの段階で MultipartException がキャッチされてスローされ (戻り値があり)、コントローラー層に到達しなかったためです。これは、MultipartException 例外をキャプチャできるものの、オブジェクトをフロントエンドに正しく返すことができない (戻り値は事前に処理される) グローバル キャプチャを設定する理由でもあります。
解決する
偉人からの抜粋記事には 2 つの解決策が示されていますが、私は最もシンプルで便利な方を使用しました。
プロジェクトの構成ファイル application.yml でリクエスト サイズ制限とアップロード ファイル サイズ制限、および Tomcat の最大スループットを構成します。
spring:
servlet:
multipart:
max-file-size: 5MB
max-request-size: 20MB
server:
port: 8999
tomcat:
# 当文件超过tomcat的大小限制后会先于Controller触发异常,此时我们的异常处理器无法捕获异常
max-swallow-size: 30MB # 内嵌tomcat的最大吞吐量,设置 -1 不限制
問題 2: アップロード ファイルのインターフェイスとリクエストが必要な条件に従っていません。
2 番目の問題は、ファイルをアップロードするためのフロントエンド インターフェイスとバックエンド インターフェイスの共同デバッグで発生します。例外情報は次のとおりです。
org.springframework.web.multipart.MultipartException: The current request is not a multipart request
理由
最も起こりやすい間違いの理由と解決策は、私の研究で次のように要約されています。
1. リクエストメソッドはポストである必要があります
2. 要求された contentType は「multipart/」で始まるように設定する必要があります。
3. バックエンド インターフェイスの受信パラメータでは、@RequestParam を使用して、ファイル データの受信に使用されるフォームのキーを指定する必要があります。
解決する
主なポイントは次のとおりです
フロントエンドコード:
この3枚目の写真に注目してください!!
バックエンドインターフェース
@RestController @RequestMapping("/file") @Slf4j public class FileWorkerController { @PostMapping("upload") @ResponseBody ResultVO<String> uploadAndSaveForImage(@RequestParam("file") MultipartFile file) { log.info("multipart ==> {}", file); return ResultVO.ok(); } }
偉人の記事から学びましょう: http://t.csdn.cn/LYbHF
この後輩には本当に感謝しています!
個人的な問題
では、私の精神的な弱さはどこにあるのでしょうか?実際、フロントエンド コードでは FormData オブジェクトをカプセル化し、ファイル file を渡しました。。。無言。。
あとがき
したがって、詳細が成功または失敗を決定し、見つけるのが最も難しいバグは最下位レベルの操作に現れる可能性があります。すべての情報を検索しても主要な問題が解決されていないことがわかったら、自分自身の問題を見つけてください。もちろん、最初から自分自身の問題なのかどうかに注意を払うこともできます。私もこの機会に自分自身を思い出し、謙虚さを保ち、前進していきたいと思います。!
他にご意見やご意見がございましたら、コメント欄に残してください。他に協力や交換の意思がある場合は、お気軽に個人的にメッセージを送ってください。