Golang memiliki sebuah fitur yang bernama FileServer
. Dengan ini, kita bisa membuat handler di golang web yang digunakan sebagai static file server. Dengan menggunakan FileServer
, kita tidak perlu manual me-load file lagi. FileServer
adalah handler, jadi kita bisa tambahkan ke dalam http.Server
atau http.ServeMux
Kode program : Membuat file server
Pertama buatlah folder baru dengan nama resources
dan didalam nya buat file static baru dengan nama index.html
dan isikan baris kode berikut
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
Kemudian buat file baru pada project dengan nama file_server_test.go
dan isikan baris kode berikut
package belajar_golang_web
import (
"net/http"
"testing"
)
func TestFileServer(t *testing.T) {
directory := http.Dir("./resources")
fileServer := http.FileServer(directory)
mux := http.NewServeMux()
mux.Handle("/static/", fileServer)
server := http.Server{
Addr: "localhost:8080",
Handler: mux,
}
err := server.ListenAndServe()
if err != nil {
panic(err)
}
}

Jika kita coba jalankan, saat kita membuka misal /static/index.html
maka akan terjadi error 404 Not Found
. Hal ini dikarenakan FileServer
akan membaca URL, lalu mencari file berdasarkan URLnya, jadi jika kita membuat static/index.html
maka FileServer
akan mencari ke file /resource/static/index.js
. Hal ini menyebabkan 404 Not Found
karena memang file nya tidak bisa ditemukan. Oleh karena itu kita bisa menggunakan function http.StripPrefix()
untuk menghapus prefix di URL.
Ubah baris ke 13 menjadi mux.Handle("/static/", http.StripPrefix("/static", fileServer))
Barias kode lengkap nya akan menjadi seperti berikut
package belajar_golang_web
import (
"net/http"
"testing"
)
func TestFileServer(t *testing.T) {
directory := http.Dir("./resources")
fileServer := http.FileServer(directory)
mux := http.NewServeMux()
mux.Handle("/static/", http.StripPrefix("/static", fileServer))
server := http.Server{
Addr: "localhost:8080",
Handler: mux,
}
err := server.ListenAndServe()
if err != nil {
panic(err)
}
}

Pada baris kode diatas, di baris ke 13 kita me remove prefix /static
, dengan begini seharusnya file sudah bisa di temukan, coba jalankan unit test nya dan coba akses url http://localhost:8080/static/index.html

Golang Embed
Di golang v1.16 terdapat fitur baru yang bernama golang embed, dalam golang embed kita bisa embed file ke dalam binary distribution file, hal ini mempermudah sehingga kita tidak perlu mengcopy static file lagi. Golang embed juga memiliki fitur yang bernama embed.FS
, fitur ini bisa di integrasikan dengan FileServer
.
package belajar_golang_web
import (
"embed"
"io/fs"
"net/http"
"testing"
)
//go:embed resources
var resources embed.FS
func TestFileServerGoEmbed(t *testing.T) {
directory, _ := fs.Sub(resources, "resources")
fileServer := http.FileServer(http.FS(directory))
mux := http.NewServeMux()
mux.Handle("/static/", http.StripPrefix("/static", fileServer))
server := http.Server{
Addr: "localhost:8080",
Handler: mux,
}
err := server.ListenAndServe()
if err != nil {
panic(err)
}
}

Penutup
Pada artikel kali ini kita telah belajar tentang file server pada golang web. Dan pada artikel selanjutnya saya akan membahas ServeFile pada golang web.