Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
31 Aug 2023 · 3 mnt baca ·Artikel 38 / 119
Go

08 Memahami File Server

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

Pengenalan File Server

Pada Golang memiliki sebuah fitur yang bernama FileServer. Dengan ini kita bisa membuat Handler di Golang Web yang telah kita gunakan itu sebagai static file server dan FileServer ini tidak perlu manual melakukan load lagi. Sehingga kita bisa tambahkan ke dalam http.Server atau http.ServeMux.

Menerapkan pada Handler Project

Pada project sebelumnya kita telah membuat Handler yang bisa kita jalankan. Maka kita akan coba mengubah dan menambahkan FileServer ini pada handler yang sudah kita buat.

Kita akan memperbaiki program pada file main.go menjadi seperti ini.

go
 1func main() {
 2	directory := http.Dir("./resources")
 3	fileServer := http.FileServer(directory)
 4
 5	mux := http.NewServeMux()
 6	mux.Handle("/static/", fileServer)
 7
 8    ...
 9    ...
10    ...
11
12    server := http.Server{
13		Addr:    "localhost:8080",
14		Handler: mux,
15	}
16
17	err := server.ListenAndServe()
18	if err != nil {
19		panic(err)
20	}
21}

Pastikan kode program berjalan dengan baik dengan melakukan build dan menjalankan programnya.

go
1go build && ./learn-golang-web

Jika sudah berjalan kita akan coba mengakses path url dari FileServer kita yang sudah kita tambahakn pada program.

bash
1http://localhost:8080/static

Terjadi 404 Not Found

Ketika program kita berjalan dan membuka /static/index.html atau /static/index.js terjadi error 404 Not found. Kenapa ini bisa terjadi? Karena FileServer akan membaca url tersebut lalu mencari file berdasarkan URL-nya. Misalkan jika kita membuka /static/index.html, maka FileServer akan mencari file di /resources/static/index.html, jika tidak ditemukan maka akan menyebabkan error 404 Not Found. Oleh karena itu, kita bisa menggunakan fungsi http.StripPrefix() untuk menghapus prefix dari URL.

Maka kita perlu ubah kode program menjadi seperti ini.

go
1	mux.Handle("/static/", http.StripPrefix("/static", fileServer))

Saat kita coba membuka file kembali maka otomatis file yang sudah kita buat sudah bisa diakses dan dibuka oleh browser.

Menggabungkan FileServer dengan Golang Embed

Pada artikel sebelumnya pernah kita bahas yaitu tentang Pengenalan Implementasi Embeded . Jadi untuk mengenal suatu folder dan membaca semua file yang ada pada folder tersebut kita juga bisa menggunakan Embed. Nah, lalu bagaimana caranya?

Pertama kita akan menambahkan Embed ini pada program kita seperti dibawah ini.

go
 1//go:embed resources
 2var resources embed.FS
 3
 4func main() {
 5	fileServer := http.FileServer(http.FS(resources))
 6
 7	mux := http.NewServeMux()
 8	mux.Handle("/static/", http.StripPrefix("/static", fileServer))
 9
10	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
11		fmt.Fprint(w, "hello world")
12	})
13
14	mux.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
15		fmt.Fprint(w, "Hi")
16	})
17
18	mux.HandleFunc("/req", func(w http.ResponseWriter, r *http.Request) {
19		fmt.Fprintln(w, r.Method)
20		fmt.Fprintln(w, r.RequestURI)
21	})
22
23	mux.HandleFunc("/set-cookie", SetCookieHandler)
24	mux.HandleFunc("/get-cookie", GetCookieHandler)
25
26	server := http.Server{
27		Addr:    "localhost:8080",
28		Handler: mux,
29	}
30
31	err := server.ListenAndServe()
32	if err != nil {
33		panic(err)
34	}
35}

Lalu kita jalankan program kita dan buka browser dan akses kembali URL yang tadi kita buat. Jika terjadi error 404 dikarenakan Golang embed itu akan membaca nama folder mengikuti dengan dengan path dari URL-nya sehingga jika kita menyimpan di folder resources maka untuk membuka file di folder tersebut perlu menambahkan nama foldernya ke dalam path URL menjadi seperti ini /static/resources/index.css.

Dan bagaimana caranya kita tidak ingin menambahkan nama folder tersebut dalam path URL web kita? Maka caranya yaitu kita bisa menggunakan fungsi fs.Sub() untuk mendapatkan sub directory-nya.

go
1	directory, _ := fs.Sub(resources, "resources")
2	fileServer := http.FileServer(http.FS(directory))

Jalankan kembali program yang sudah kita buat dan buka browser dan akses path file-nya maka skrng sudah bisa file tersebut terbuka tanpa harus menambahkan path nama folder.

Artikel Terkait

💬 Komentar