package main import ( "flag" "fmt" "html/template" "os" "path/filepath" "strings" "github.com/gin-gonic/gin" ) func main() { // 设置上传文件夹 // 定义命令行参数 -u 或 --upload uploadDir := flag.String("u", "./uploads", "upload directory") flag.Parse() // 创建目录(如果不存在) os.MkdirAll(*uploadDir, 0755) r := gin.Default() // 注册模板函数 r.SetFuncMap(template.FuncMap{ "hasSuffix": strings.HasSuffix, }) // 加载模板 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) }) fmt.Println("upload dir =", *uploadDir) r.Run("0.0.0.0:8080") fmt.Println("启动") }