pemrograman

08 Memahami File Server

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.

func main() {
	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)
	}
}

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

go build && ./learn-golang-web

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

http://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.

	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:embed resources
var resources embed.FS

func main() {
	fileServer := http.FileServer(http.FS(resources))

	mux := http.NewServeMux()
	mux.Handle("/static/", http.StripPrefix("/static", fileServer))

	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "hello world")
	})

	mux.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hi")
	})

	mux.HandleFunc("/req", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, r.Method)
		fmt.Fprintln(w, r.RequestURI)
	})

	mux.HandleFunc("/set-cookie", SetCookieHandler)
	mux.HandleFunc("/get-cookie", GetCookieHandler)

	server := http.Server{
		Addr:    "localhost:8080",
		Handler: mux,
	}

	err := server.ListenAndServe()
	if err != nil {
		panic(err)
	}
}

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.

	directory, _ := fs.Sub(resources, "resources")
	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.

comments powered by Disqus