Kode program : File server

Golang Web – File Server

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)
	}
}
Kode program : File server
Kode program : File server

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)
	}
}
Kode program : File server dengan StripPrefix
Kode program : File server dengan StripPrefix

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

Output kode program : File server
Output kode program : File server

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)
	}
}
Kode program : File server dengan golang embed
Kode program : File server dengan golang embed

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.

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar

About Me

About Me

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam.

Social Profiles

Facebook