サーバ上に保存してある画像を各クライアントのブラウザに配信をするため、FileServerを利用した。
前提
クライアントでは、ユーザ情報取得APIで返却されたJSONの中にある画像PathからURLを作りsrcに入れる
<img src="{画像URL}" className="masterx_draginfo_img" />
FileServer
Goでは、画像の配信は、net/httpパッケージに含まれる、組み込みのFileServerを利用する。
fileServerは指定ディレクトリに一致するファイルがあれば返してくれる。
HTTPプレフィックスとファイルシステムのほぼ1:1のマッピングを効果的に行える。
実装
このような実装となる
// routingはmuxを使用
r := mux.NewRouter()
fs := http.FileServer(http.Dir("./image/profile/"))
r.Handle("/image/profile/{file-name}",
http.StripPrefix("/image/profile/", fs)).Methods(http.MethodGet)
muxを使わずシンプルに書いた場合で説明する。
/home/bob/static というディレクトリがあり、このように設定されていたとする。
fs := http.FileServer(http.Dir("/home/bob/static"))
http.Handle("/static", http.StripPrefix("/static", fs))
/static へのリクエストを受け取った場合、 /home/bob/static/フォルダーにあるファイルのリストを返す。(ファイル名の指定がない場合は、リストが返される)
/static/xxxx.jpgへのリクエストを受け取った場合、/home/bob/static/フォルダーにあるxxxx.jpgファイルを返す。
2行目のhttp.StripPrefixを使わなかった場合、リクエストのパスから/static/の部分が取り除かれずに、/home/bob/static/staticへのアクセスとなる。(指定したディレクトリの末に結合される)
ちなみにディレクトリトラバーサルも対策されている為、安全。
https://shogo82148.github.io/blog/2016/04/13/serving-static-files-in-golang
参考