開発環境
- Spring Boot 1.5.9
- spring-webmvc 4.3.13
- Java8
背景
/tmp/download/
フォルダ直下に存在するファイルを、ダウンロードさせるため、以下のクラスを作成しました。
java
1 2@Controller 3public class DownloadController { 4 5 /** 6 * `/tmp/download/`フォルダ直下に存在するファイルを、ダウンロードする。 7 * @param filename ダウンロード対象のファイル名 8 */ 9 @GetMapping("/download/{filename:.+}") 10 public ResponseEntity<byte[]> download(@PathVariable String filename) throws IOException { 11 Path path = Paths.get("/tmp/download/" + filename); 12 //ファイルの存在確認 13 if (!Files.exists(path)) { 14 //TODO 本当はエラー画面に遷移したいが、方法が分からない 15 throw new RuntimeException("ファイルが存在しません。"); 16 } 17 18 HttpHeaders headers = new HttpHeaders(); 19 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 20 headers.add("Content-Disposition", "attachment;filename=\"" + filename +"\""); 21 22 return new ResponseEntity<>(Files.readAllBytes(path), headers, HttpStatus.OK); 23 24 } 25}
実現したいこと
ダウンロード対象のファイルが存在するか判定して、存在しなければNOT FOUNDのエラー画面に遷移させたいです。
今は暫定的に、RuntimeException
をスローしています。
質問
エラー画面に遷移する方法を教えていただきたいです。
ModelAndView
オブジェクトを使えばエラー画面に遷移できそうですが、戻り値がResponseEntity
であるため、ModelAndView
オブジェクトを使えません。
追記1
@ExceptionHandler
を付けたメソッドを追加して、エラー画面に遷移することはできました。
java
1 @ExceptionHandler(Exception.class) 2 public ModelAndView handleError(Exception ex) { 3 ModelAndView mav = new ModelAndView(); 4 mav.setViewName("error/404"); 5 return mav; 6 }
追記2
@ResponseStatus
を付けて、HTTPステータスコードを404にしました。
また、template/error/404.html
を作成して、その画面に遷移させました。
java
1 2 @ResponseStatus(HttpStatus.NOT_FOUND) 3 @ExceptionHandler(Exception.class) 4 public ModelAndView handleError(Exception ex) { 5 ModelAndView mav = new ModelAndView(); 6 mav.setViewName("error/404"); 7 return mav; 8 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/14 05:04
退会済みユーザー
2018/01/14 05:41
2018/01/14 07:01