package main import ( "fmt" "html/template" "os" "path/filepath" "strings" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 注册模板函数 r.SetFuncMap(template.FuncMap{ "hasSuffix": strings.HasSuffix, }) // 设置上传文件夹 uploadDir := "./uploads" os.MkdirAll(uploadDir, 0755) // 加载模板 r.LoadHTMLGlob("templates/*") // 首页:列出文件 r.GET("/", func(c *gin.Context) { var files []string filepath.Walk(uploadDir, func(path string, info os.FileInfo, err error) error { if !info.IsDir() { files = append(files, info.Name()) } return nil }) c.HTML(200, "index.html", gin.H{ "files": files, }) }) // 上传接口 r.POST("/upload", func(c *gin.Context) { form, err := c.MultipartForm() if err != nil { c.JSON(400, gin.H{"error": "Invalid form data"}) return } files := form.File["files"] if len(files) == 0 { c.JSON(400, gin.H{"error": "No files uploaded"}) return } for _, file := range files { dst := filepath.Join(uploadDir, file.Filename) if err := c.SaveUploadedFile(file, dst); err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } } c.JSON(200, gin.H{ "message": fmt.Sprintf("Uploaded %d files", len(files)), }) }) // 删除文件 r.DELETE("/delete/:filename", func(c *gin.Context) { filename := c.Param("filename") path := filepath.Join(uploadDir, filename) if _, err := os.Stat(path); os.IsNotExist(err) { c.JSON(404, gin.H{"error": "File not found"}) return } if err := os.Remove(path); err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } c.JSON(200, gin.H{"message": "Deleted"}) }) // 下载接口 r.GET("/download/:filename", func(c *gin.Context) { filename := c.Param("filename") filepath := filepath.Join(uploadDir, filename) c.FileAttachment(filepath, filename) }) r.Run("0.0.0.0:8080") fmt.Println("启动") }