Essa tarefa é muito fácil com o pacote Golang net / http.
Tudo que você precisa fazer é:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
assumindo que os arquivos estáticos estão em uma pasta nomeada static
no diretório raiz do projeto.
Se estiver na pasta static
, você terá uma index.html
chamada de arquivo http://localhost:3000/
que resultará na renderização desse arquivo de índice em vez de listar todos os arquivos disponíveis.
Além disso, chamar qualquer outro arquivo nessa pasta (por exemplo http://localhost:3000/clients.html
) mostrará esse arquivo, devidamente renderizado pelo navegador (pelo menos Chrome, Firefox e Safari :))
ATUALIZAÇÃO: disponibilizando arquivos de url diferente de "/"
Se você quiser servir arquivos, diga da pasta ./public
em url: localhost:3000/static
Você deve usar uma função adicional : func StripPrefix(prefix string, h Handler) Handler
assim:
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
http.ListenAndServe(":3000", nil)
}
Graças a isso, todos os seus arquivos de ./public
estão disponíveis emlocalhost:3000/static
Sem http.StripPrefix
função, se você tentar acessar o arquivo localhost:3000/static/test.html
, o servidor irá procurá-lo em./public/static/test.html
Isso ocorre porque o servidor trata todo o URI como um caminho relativo para o arquivo.
Felizmente, isso é facilmente resolvido com a função integrada.
/static/
não é/static
?/static
padrão (e prefixo de faixa), apenas ashttp://example.org/static
solicitações seriam atendidas pelo manipulador FileServer. Isso significa que as solicitações parahttp://example.org/static/
ehttp://example.org/static/foo.css
etc. falhariam ou seriam tratadas por outro manipulador.Eu prefiro usar
http.ServeFile
para isso ao invéshttp.FileServer
. Eu queria a navegação no diretório desabilitada, um erro 404 adequado se arquivos estiverem faltando e uma maneira fácil de criar um caso especial para o arquivo de índice. Dessa forma, você pode simplesmente colocar o binário integrado em uma pasta e ele servirá tudo relativo a esse binário. Claro, você pode usarstrings.Replace
onp
se tiver os arquivos armazenados em outro diretório.func main() { fmt.Println("Now Listening on 80") http.HandleFunc("/", serveFiles) log.Fatal(http.ListenAndServe(":80", nil)) } func serveFiles(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL.Path) p := "." + r.URL.Path if p == "./" { p = "./static/index.html" } http.ServeFile(w, r, p) }
fonte
Isso é principalmente o que descreve " Escrevendo aplicativos da Web " e como um projeto hugo (gerador de site HTML estático) faz.
Trata-se de ler um arquivo e responder com um ContentType "text / html":
func (server *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { err := server.renderFile(w, r.URL.Path) if err != nil { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(http.StatusNotFound) server.fn404(w, r) } }
com
renderFile()
essencialmente lendo e definindo o tipo certo:file, err = ioutil.ReadFile(server.MediaPath + filename) if ext != "" { w.Header().Set("Content-Type", mime.TypeByExtension(ext)) }
fonte
Isso é fácil no golang como:
package main import ( "log" "net/http" ) func main() { log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))) }
`
Você pode apenas fazer isso e certificar-se de manter seu arquivo HTML como
index.html
fonte
Exemplo de como servir arquivo mp3 personalizado:
r := http.NewServeMux() r.HandleFunc("/file/*", func(w http.ResponseWriter, r *http.Request) { // Prepare file path pathFile := strings.ReplaceAll(r.RequestURI, "/file/", "./my_path/") f, err := os.Open(pathFile) if f == nil || err != nil { return } // Read file into memory fileBytes, err := ioutil.ReadAll(f) if err != nil { log.Println(err) _, _ = fmt.Fprintf(w, "Error file bytes") return } // Check mime type mime := http.DetectContentType(fileBytes) if mime != "audio/mpeg" { log.Println("Error file type") _, _ = fmt.Fprintf(w, "Error file type") return } // Custom headers r.Header.Add("Content-Type", "audio/mpeg") r.Header.Add("Cache-Control", "must-revalidate, post-check=0, pre-check=0") r.Header.Add("Content-Description", "File Transfer") r.Header.Add("Content-Disposition", "attachment; filename=file.mp3") r.Header.Add("Content-Transfer-Encoding", "binary") r.Header.Add("Expires", "0") r.Header.Add("Pragma", "public") r.Header.Add("Content-Length", strconv.Itoa(len(fileBytes))) http.ServeFile(w, r, pathFile) }) log.Fatal(http.ListenAndServe(":80", r))
fonte