Springの例外処理「MaxUploadSizeExceededException」の対処法を初心者向けに完全解説
生徒
「Spring Bootでファイルをアップロードしようとしたら、エラーが出て処理できませんでした。どうしたらいいですか?」
先生
「そのエラーはおそらく、MaxUploadSizeExceededExceptionという例外が発生している可能性がありますね。これはファイルのサイズ制限を超えたときに発生するSpringの例外です。」
生徒
「それって、どこで設定を変えたり、どうやってキャッチしてエラーメッセージを出したりするんですか?」
先生
「とても良いところに気が付きましたね!では、初心者でもわかるように、Spring Bootでのファイルアップロードのサイズ制限の設定と、MaxUploadSizeExceededExceptionの対処方法を丁寧に解説していきましょう。」
1. Spring Bootのファイルアップロードで起きる例外とは?
Spring Bootでファイルをアップロードする処理を実装する際、大きなファイルを送信するとMaxUploadSizeExceededExceptionという例外が発生することがあります。この例外は、アップロードされたファイルが設定された最大サイズを超えた場合に発生する例外です。
このようなエラーは、画像や動画などの大きなファイルを扱う場合に特に注意が必要です。初心者がつまずきやすいポイントなので、しっかり理解しておきましょう。
2. MaxUploadSizeExceededExceptionが発生する原因
MaxUploadSizeExceededExceptionは、Spring Bootでファイルアップロードのサイズが制限を超えたときに自動的にスローされます。たとえば、デフォルトでは1MBまでしか許可されていないことが多く、それを超えるファイルをアップロードすると例外が発生します。
3. アップロードサイズ制限の設定方法(application.properties)
ファイルサイズの上限は、application.propertiesまたはapplication.ymlで設定できます。以下のように設定すると、ファイルサイズの上限を変更できます。
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
max-file-sizeは1つのファイルのサイズ上限、max-request-sizeは複数ファイルを含むリクエスト全体の上限です。大きめのファイルを扱いたい場合は、適切に調整しましょう。
4. MaxUploadSizeExceededExceptionをキャッチして丁寧なエラーメッセージを表示する
Springでは、例外をハンドリングする方法として、@ControllerAdviceを使うのが一般的です。以下のようにMaxUploadSizeExceededExceptionを捕捉して、ユーザーにわかりやすいメッセージを返すことができます。
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
public class FileUploadExceptionAdvice extends ResponseEntityExceptionHandler {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public String handleMaxSizeException(MaxUploadSizeExceededException exc, RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("message", "アップロードされたファイルサイズが大きすぎます。10MB以下のファイルを選択してください。");
return "redirect:/uploadPage";
}
}
このコードを使うことで、ファイルサイズの制限を超えたときに、エラーページにリダイレクトしつつ、フラッシュメッセージとしてエラー内容を表示できます。
5. HTMLフォーム側のファイルアップロード対応
HTML側でも、ファイルをアップロードするためのフォームを用意する必要があります。以下のように記述することで、ユーザーがファイルを選択して送信できます。
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">アップロード</button>
</form>
enctype="multipart/form-data"を忘れると、ファイルが正しく送信されないので注意しましょう。
6. コントローラー側でのファイル受け取り処理
Spring Bootでは、アップロードされたファイルをMultipartFileとして受け取ります。以下がその一例です。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@Controller
public class FileUploadController {
private static final String UPLOAD_DIR = "uploads/";
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
try {
byte[] bytes = file.getBytes();
Path path = Paths.get(UPLOAD_DIR + file.getOriginalFilename());
Files.write(path, bytes);
redirectAttributes.addFlashAttribute("message",
"ファイル '" + file.getOriginalFilename() + "' のアップロードに成功しました!");
} catch (IOException e) {
redirectAttributes.addFlashAttribute("message",
"ファイルの保存中にエラーが発生しました。");
}
return "redirect:/uploadPage";
}
}
このコードで、アップロードされたファイルを指定したディレクトリに保存し、結果に応じてフラッシュメッセージを表示します。
7. 実行結果の例
正常にファイルがアップロードされた場合と、サイズ制限を超えた場合の出力例は以下のとおりです。
成功時の出力例:
ファイル 'example.jpg' のアップロードに成功しました!
サイズ制限超過時の出力例:
アップロードされたファイルサイズが大きすぎます。10MB以下のファイルを選択してください。
8. ファイルサイズ制限以外の例外にも備えよう
IOExceptionやIllegalStateExceptionなど、ファイルアップロードでは他にもさまざまな例外が発生する可能性があります。それぞれに対して適切な例外処理を記述することで、アプリケーションの信頼性を高めることができます。
9. Spring Bootで使えるその他の便利なプロパティ
以下のようなプロパティも設定可能です:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=/tmp
spring.servlet.multipart.file-size-threshold=2MB
一時ファイルの保存先や、ファイルサイズのしきい値なども変更できるので、用途に応じてカスタマイズしましょう。