

ファイルダウンロードを勉強しています。

英語のサイトを見ているのですが、何が正解なのかわかっていません。

**・ResponseEntity＜Resource＞をreturnするケース**

[code]

    return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(contentType))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" resource.getFilename() + "\"")
                .body(resource);
    
[/code]

<https://www.callicoder.com/spring-boot-file-upload-download-rest-api-
example/>

**・voidを返すケース**

[code]

    ServletOutputStream　outputStream = httpServletResponse.getOutputStram();
    
[/code]

<https://youtu.be/ryRQ6qXLLYM?t=4401>

どっちでもダウンロードの結果は変わりないように見えるのですが。  
どなたか参考となるサイトでも大丈夫ですので、教えていただけると助かります。


CC BY-SA 4.0
2021-01-29T06:10:50.083
73676
2023-08-18T03:02:40.327
2021-01-29T07:50:36.510
3060
43731
question
java spring-boot
Spring boot ファイルダウンロードについて


Spring MVC のリファレンスに、ハンドラの戻り値についての説明があります:

  * [1.3.3. Handler Methods > Return Values](https://docs.spring.io/spring-framework/docs/5.3.3/reference/html/web.html#mvc-ann-return-types)

曰く、

> `ResponseEntity<B>`:  
>  The return value that specifies the full response (including HTTP headers
> and body) is to be converted through `HttpMessageConverter` implementations
> and written to the response. See
> [`ResponseEntity`](https://docs.spring.io/spring-
> framework/docs/5.3.3/reference/html/web.html#mvc-ann-responseentity).
>
> `void`:  
>  A method with a `void` return type (or `null` return value) is considered
> to have fully handled the response if it also has a `ServletResponse`, an
> `OutputStream` argument, or an `@ResponseStatus` annotation.(後略)

前者はSpring MVCのサポートを受ける方式、後者はサポートを受けずに素のServlet APIで実現する方式です。

一般的には、楽をするためにフレームワークを使っているので前者の方式を使うのが妥当であるということになるかと思いますが、お仕着せの挙動が自分の作りたいものに反しているので後者を選択する、というようなことも十分あり得るかと考えます。

今回の場合だと、前者を使うことで、ストリームに書いてcloseするといった部分は自前で書く必要が無くなる分楽になっている、と言えるかと思います。


CC BY-SA 4.0
2021-01-29T20:39:37.167
73688
2021-01-29T20:39:37.167
2808
73676
answer