SpringMVCで画像またはファイルをダウンロードする
1. 概要
クライアントへの静的ファイルの提供はさまざまな方法で行うことができ、Springコントローラーの使用が必ずしも最良のオプションであるとは限りません。
ただし、コントローラールートが必要な場合もあります。これについては、このクイック記事で取り上げます。.
2. Mavenの依存関係
まず、pom.xmlに依存関係を追加する必要があります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
それだけです。ここでは他に何も必要ありません。 バージョン情報については、 MavenCentralにアクセスしてください。
3. @ResponseBodyを使用する
最初の簡単な解決策は、コントローラーメソッドで @ResponseBody アノテーションを使用して、メソッドによって返されるオブジェクトをHTTP応答本文に直接マーシャリングする必要があることを示すことです。
@GetMapping("/get-text")
public @ResponseBody String getText() {
return "Hello world";
}
したがって、このメソッドは、より一般的なMVCアプリケーションのように、名前が Hello world のビューを返すのではなく、文字列 Helloworldを返すだけです。
@ResponseBody を使用すると、対応するHTTPメッセージコンバーターを処理して出力ストリームにマーシャリングできる限り、ほとんどすべてのメディアタイプを返すことができます。
4. を使用すると、画像を返すためのが生成されます
バイト配列を返すと、画像やファイルなど、ほとんどすべてのものを返すことができます。
@GetMapping(value = "/image")
public @ResponseBody byte[] getImage() throws IOException {
InputStream in = getClass()
.getResourceAsStream("/com/baeldung/produceimage/image.jpg");
return IOUtils.toByteArray(in);
}
ここでは、返されるバイト配列が画像であることを定義していません。 したがって、クライアントはこれを画像として処理できなくなります。おそらく、ブラウザは画像の実際のバイトを表示するだけです。
返されるバイト配列が画像に対応することを定義するために、@GetMappingアノテーションのproduces属性を設定して、返されるオブジェクトのMIMEタイプを正確にすることができます。
@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画像として処理する必要があることを示します。
そして今、ブラウザは応答本文を画像として認識し、適切に表示します。
5. を使用すると、生データを返すためにが生成されます
パラメータproducesは、返すオブジェクトのタイプに応じて、さまざまな値に設定できます(完全なリストはここにあります)。
したがって、生のファイルを返したい場合は、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);
}
6. 結論
この簡単な記事では、SpringControllerから画像またはファイルを返すという単純な問題について説明しました。
そして、いつものように、サンプルコードはGithubのにあります。