93772


Javaではない外部アプリから呼び出され、ダウンロードファイルを返すControllerクラスの実装方法について教えてください。  
以下のURLにアクセスすると、呼び出し元画面上にダウンロードダイアログを開きます。  
Springでjspを返さずに、ダウンロードファイルだけを返すメソッド場合、以下の実装方法だとreturnが空になってしまいます。  
正しい実装方法を教えてください。

[code]

    @Controller
    public class downloadController {
        @RequestMapping(path="/download", method="GET")
        public String download(@RequestParam param, HttpServletResponse res) throws Exception {
            // 何かの処理
            res.setContentType("application/octed-stream");
            res.Header("Content-Disposition", String.format("attachment; filename=\"" + fileName + "\""));
            FileCopyUtils.copy(new BufferedInputStream(new FileInputStream(file)), res.getOutputStream());
            return "";
        }
    }
    
[/code]

構成：動的プロジェクト  
Spring：5.3.19


CC BY-SA 4.0
2023-02-08T00:24:12.687
93753
2023-02-08T12:27:38.393
question
java spring
view（jsp）を返さないレスポンスのあるControllerクラスの実装方法


ダウンロードファイルを返す`View`(`AbstractView`)クラスを実装して、`Controller`クラスでは、そのView名をreturnするように実装すると良いと思います。(`Controller`で実装している内容を`View`に移すイメージ)

実装イメージ(View)

[code]

    import org.springframework.web.servlet.view.AbstractView;
    // 他のimportは省略
    
    @Component
    public class DownloadView extends AbstractView {
        @Override
        protected void renderMergedOutputModel(
            Map<String, Object> model,
            HttpServletRequest request,
            HttpServletResponse response)
                throws Exception {
            String fileName = (String) model.get("fileName");
    
            response.setContentType("application/octed-stream");
            response.Header("Content-Disposition", String.format("attachment; filename=\"" + fileName + "\""));
            FileCopyUtils.copy(new BufferedInputStream(new FileInputStream(filename)), response.getOutputStream());
        }
    }
    
[/code]

実装イメージ(Controller)

[code]

    @Controller
    public class downloadController {
        @RequestMapping(path="/download", method="GET")
        public String download(@RequestParam param, HttpServletResponse res, Model model) throws Exception {
            // 何かの処理
    
            // ダウンロードするファイル名を設定する
            model.addAttribute("fileName", param.getFilename());
            return "downloadView";
        }
    }
    
[/code]


CC BY-SA 4.0
2023-02-08T12:27:38.393
93772
2023-02-08T12:27:38.393
20098
93753
answer