Javaで画像を表示したい!
YuruFuwaFoxです。Javaを勉強しています。
今回はSpringのRESTControllerで画像を表示するにはどうすればいいんだろう?ということで色々調べながら実装したので、その方法をメモがてら共有したいと思います!
###注釈
この記事はJavaのかなりの初心者に向けた内容です。
我こそはつよつよエンジニア、という人向けではないのでそこについてはよろしくお願いします。
それでも読んでくださるならありがとうございます!
(間違っているところの指摘なども大歓迎です!)
##RESTControllerで画像を表示するって???
まず、RESTControllerとはなんぞや?からを説明していきます。
RESTControllerというのは返り値にJSONやxmlを返す、いわゆるAPIのためのものです。
普通のControllerであれば基本的にViewを返すところを、単純にデータのみを渡すという感じですね!
つまりViewを返すのであれば、単純にViewに画像を渡してどうにか表示できそうですが、JSONやxmlを返すRESTControllerではどうすればいいんでしょうか?
##バイナリ形式でデータを渡す
画像はバイナリデータで渡すことで表示できます。
そこで、画像をバイナリ形式にして渡すことで画像を表示することにしました。
##HttpEntityにデータを渡して画像を表示させる
画像の表示はブラウザで表示させることにします。
そこで、HttpEntityを利用してレスポンスボディーに画像を入れてあげることにします。
public HttpEntity<[byte]> showImg(String image) throws IOException{
//画像の取得
Resource resource = resourceLoader.getResource("File:" + staticPath + imgPath);
//画像形式取得のため
String format;
//バイトデータ格納のため
ByteArrayOutputStream bout;
//画像をバイトデータに
try (InputStream img = resource.getInputStream()) {
format = URLConnection.guessContentTypeFromStream(img);
bout = new ByteArrayOutputStream();
int c;
while ((c = img.read()) != -1) {
bout.write(c);
}
}
//バイトデータを取り出す
byte[] bytes = bout.toByteArray();
//ヘッダーを作成
HttpHeaders headers = new HttpHeaders();
//ヘッダーにコンテンツの情報を収納
headers.setContentType(MediaType.valueOf(format));
headers.setContentLength(bytes.length);
//HttpEntityにバイトデータとヘッダーを渡して返す
return new HttpEntity<>(bytes, headers);
}
###終わりに
本当にメモ程度になったため、雑な感じです。
画像のバイトデータ変換も、IOUtilsを利用すれば実は一行でできますが、今回は忘れていたため、こんな形になりました。
誰かの役に立てれば幸いです!