Spring MVCで画像やファイルをダウンロードする

1.概要

静的ファイルをクライアントに提供するにはさまざまな方法がありますが、Spring Controllerを使用することが必ずしも最良の方法であるとは限りません。

しかし、時にはコントローラのルートが必要になることがあります。それが、このクイック記事で重点的に取り上げることです。

2. @ ResponseBody を使う

最初の直接的な解決策は、コントローラメソッドに @ ResponseBody アノテーションを使用して、そのメソッドによって返されたオブジェクトをHTTPレスポンスボディに直接整列化することを示すことです。

@GetMapping("/get-text")
public @ResponseBody String getText() {
    return "Hello world";
}

したがって、このメソッドは、より一般的なMVCアプリケーションのように、名前が Hello world のビューを返すのではなく、文字列 Hello world を返すだけです。

@ ResponseBody を使用すると、対応するHTTP Messageコンバータを処理して出力ストリームに整列化できる限り、ほとんどすべてのメディアタイプを返すことができます。

3. produces を使って画像を返す

バイト配列を返すことで、画像やファイルなど、ほとんど何でも返すことができます。

@GetMapping(value = "/image")
public @ResponseBody byte[]getImage() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

ここでは、返されるバイト配列が画像であるとは定義していません。

したがって、クライアントはこれを画像として処理することはできません - おそらくブラウザは単に画像の実際のバイト数を表示するだけです。

返されるバイト配列が画像に対応することを定義するために、返されるオブジェクトのMIMEタイプを正確にするために、 @ GetMapping アノテーションの produces 属性を設定できます。

@GetMapping(
  value = "/get-image-with-media-type",
  produces = MediaType.IMAGE__JPEG__VALUE
)
public @ResponseBody byte[]getImageWithMediaType() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

ここで produces MediaType.IMAGE JPEG VALUE に設定され、返されたオブジェクトをJPEG画像として扱う必要があることを示します。

そして今、ブラウザはレスポンスボディを画像として認識し正しく表示しようとしています。

4.生データを返すための produces の使い方

パラメータ produces は、さまざまな値に設定できます(完全なリストは、http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/MediaType.htmlにあります。[ここ])返すオブジェクトの種類によって異なります。

したがって、生ファイルを返す場合は、単に APPLICATION OCTET STREAM VALUE__を使用できます。

@GetMapping(
  value = "/get-file",
  produces = MediaType.APPLICATION__OCTET__STREAM__VALUE
)
public @ResponseBody byte[]getFile() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/data.txt");
    return IOUtils.toByteArray(in);
}

5.まとめ

この簡単な記事では、Spring Controllerから画像やファイルを返すという単純な問題を見てきました。

そしていつものように、サンプルコードはhttps://github.com/eugenp/tutorials/tree/master/spring-rest/src/main/java/com/baeldung/produceimage[over on Github]にあります。