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]にあります。