Compare commits

...

2 Commits

Author SHA1 Message Date
f6cb0a2c62 Remove UploadOnly value. 2023-12-21 11:19:22 +01:00
75ae2871f6 List and preview uploaded files. 2023-12-21 11:15:27 +01:00
2 changed files with 95 additions and 5 deletions

85
main.go
View File

@ -8,6 +8,7 @@ import (
"log" "log"
"net/http" "net/http"
"os" "os"
"regexp"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware" "github.com/labstack/echo/v4/middleware"
@ -60,9 +61,18 @@ type Template struct {
templates *template.Template templates *template.Template
} }
type File struct {
Name string
FileType string
Content string
}
type FilesData struct {
Files []File
}
type IndexData struct { type IndexData struct {
Host string Host string
UploadOnly bool
} }
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error { func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
@ -71,14 +81,79 @@ func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Con
func Index(c echo.Context) error { func Index(c echo.Context) error {
data := IndexData{ data := IndexData{
Host: c.Request().Host, Host: c.Request().Host,
UploadOnly: false,
} }
return c.Render(http.StatusOK, "index", data) return c.Render(http.StatusOK, "index", data)
} }
func GetFileContentType(ouput *os.File) (string, error) {
buf := make([]byte, 512)
_, err := ouput.Read(buf)
if err != nil {
return "", err
}
contentType := http.DetectContentType(buf)
return contentType, nil
}
func Files(c echo.Context) error { func Files(c echo.Context) error {
return c.Render(http.StatusOK, "files", "test") var files FilesData
filelist, err := os.ReadDir("./files/")
if err != nil {
log.Fatal(err)
}
var Type string
var Content string
ImageMatch := regexp.MustCompile("^image/.*")
VideoMatch := regexp.MustCompile("^video/.*")
JsonMatch := regexp.MustCompile("application/json")
TextMatch := regexp.MustCompile("^text/.*|application/octet-stream")
for _, f := range filelist {
filePath := "files/" + f.Name()
file, err := os.Open(filePath)
if err != nil {
panic(err)
}
defer file.Close()
contentType, err := GetFileContentType(file)
switch {
case ImageMatch.MatchString(contentType):
Type = "image"
Content = ""
case VideoMatch.MatchString(contentType):
Type = "video"
Content = ""
case JsonMatch.MatchString(contentType):
Type = "text"
b, _ := os.ReadFile(filePath)
Content = string(b)
case TextMatch.MatchString(contentType):
Type = "text"
b, _ := os.ReadFile(filePath)
Content = string(b)
default:
Type = "else"
Content = ""
}
log.Print(contentType)
files.Files = append(
files.Files,
File{Name: f.Name(), FileType: Type, Content: Content},
)
}
return c.Render(http.StatusOK, "files", files)
} }
func Upload(c echo.Context) error { func Upload(c echo.Context) error {

View File

@ -11,6 +11,21 @@
<body> <body>
<h1>File List</h1> <h1>File List</h1>
{{range .Files}}
<hr />
<div class="file">
{{if eq .FileType "image"}}
<img src="/files/{{.Name}}" alt="{{.Name}}" />
{{else if eq .FileType "video"}}
<video controls src="/files/{{.Name}}" />
{{else if eq .FileType "text"}}
<pre>{{.Content}}</pre>
{{end}}
<div class="info">
<a href="/files/{{.Name}}" download>{{.Name}}</a>
</div>
</div>
{{end}}
</body> </body>
</html> </html>