Web, サーバ

Spring Bootで圧縮形式のsvgファイル(svgz)を配信する

SVGはScalable Vector Graphicsの略で、その名の通りスケーラブル(拡大縮小可能)な画像のフォーマット形式です。
Illustratorを含む多くのドローツールで書き出し、読込が行え、かつ表示する画面の改造度に合わせて滑らかに拡大縮小出来るためジャギーが出ません。

今回、なんとなく社内システムのロゴを今回PNG形式からSVG形式の新しいものに置き換えました。

ファイルサイズが小さくなるかと思えば18.26kbから431kbとかなり増えています。Illustratorで圧縮形式のsvgzというのがあるのを思い出したのでその形式で保存してみたところ3,688バイトとかなり軽くなりました。

しかしブラウザでレンダーされません。

svgzは、要はgzipで圧縮されているわけですがSpring BootやWebサーバがそのことに気がつかずレスポンスヘッダでContent-Encodingを設定せず、ブラウザ側で解釈に失敗するようです。

svgzを表示する

Nginx側で自動でContent-Encodingを指定するようにしてもいいのですが、ローカルでSpring Boot単体で動かす際に表示されないと気持ち悪いのでアプリケーションレベルでServletFilterでContent-Encodingを指定するようにしてみました。Spring Bootであれば以下のフィルタをプロジェクトに追加しておくだけです。

https://gist.github.com/yusuke/d29f0c16f3ecc66b0887e4300a7c60a7

無事表示されました。