init
This commit is contained in:
commit
f345ecb7d6
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
</head>
|
||||
<body>
|
||||
{{ if .Err }}
|
||||
<div style="color: red;">{{.Err}}</div>
|
||||
{{ else }}
|
||||
<ul>
|
||||
{{ range .Entries }}
|
||||
<li>
|
||||
{{ if .IsDir }}
|
||||
<a href="{{.Name}}/">{{.Name}}/</a>
|
||||
{{ else }}
|
||||
<a href="{{.Name}}">{{.Name}}</a>
|
||||
{{ end }}
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,77 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
_ "embed"
|
||||
)
|
||||
|
||||
type Entry struct {
|
||||
Name string
|
||||
IsDir bool
|
||||
}
|
||||
|
||||
type Result struct {
|
||||
Err string
|
||||
Entries []Entry
|
||||
}
|
||||
|
||||
//go:embed index.html
|
||||
var index string
|
||||
|
||||
var tpl = template.Must(template.New("index.html").Parse(index))
|
||||
|
||||
func Render(w http.ResponseWriter, data interface{}) {
|
||||
w.Header().Set("Content-Type", "text/html;charset=utf8")
|
||||
if err := tpl.Execute(w, data); err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func View(w http.ResponseWriter, r *http.Request) {
|
||||
log.Println(r.URL.Path)
|
||||
|
||||
path := filepath.Join(*dir, filepath.Clean(r.URL.Path))
|
||||
|
||||
if !strings.HasSuffix(r.URL.Path, "/") {
|
||||
w.Header().Add("Content-Disposition", fmt.Sprintf("attachment;filename=%s", filepath.Base(path)))
|
||||
http.ServeFile(w, r, path)
|
||||
return
|
||||
}
|
||||
|
||||
entries, err := os.ReadDir(path)
|
||||
if err != nil {
|
||||
Render(w, &Result{Err: err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
items := make([]Entry, 0)
|
||||
for _, entry := range entries {
|
||||
items = append(items, Entry{
|
||||
Name: entry.Name(),
|
||||
IsDir: entry.IsDir(),
|
||||
})
|
||||
}
|
||||
Render(w, &Result{Entries: items})
|
||||
}
|
||||
|
||||
var (
|
||||
dir = flag.String("dir", "./", "server file directory")
|
||||
listen = flag.String("listen", ":3000", "listen address")
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
http.HandleFunc("/", View)
|
||||
log.Printf("server listen at %s", *listen)
|
||||
log.Fatal(http.ListenAndServe(*listen, nil))
|
||||
}
|
Loading…
Reference in New Issue