单文件上传

前端

  1. <body>
  2. <form action="http://127.0.0.1:9090/upload" method="post" enctype="multipart/form-data">
  3. <input type="file" name="file_name">
  4. <input type="submit" value="upload">
  5. </form>
  6. </body>

后端

  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "path"
  6. "github.com/gin-gonic/gin"
  7. )
  8. //单文件上传
  9. func uploadfile(c *gin.Context) {
  10. file, _ := c.FormFile("file_name") //对应的是前端的文件名标签
  11. log.Println(file.Filename) //日志打印文件名
  12. dst := path.Join("./static", file.Filename) //存储目录static,目录必须是存在的
  13. c.SaveUploadedFile(file, dst) //存储
  14. c.JSON(http.StatusOK, gin.H{ //返回上传成功提示
  15. "message": "upload succeed",
  16. })
  17. }
  18. func main() {
  19. router := gin.Default() //定义默认路由
  20. router.POST("/upload", uploadfile) //文件上传
  21. router.Run(":9090") //绑定0.0.0.0:9090
  22. }

image.png
image.png

多文件上传

前端

前端和单文件是一样,只是后端处理不一样。

后端

和多文件没差多少,就是多了遍历存储。

  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "path"
  6. "github.com/gin-gonic/gin"
  7. )
  8. //多文件上传
  9. func uploadfiles(c *gin.Context) {
  10. form, _ := c.MultipartForm()
  11. files := form.File["file_name"] //对应的是前端的文件名标签,注意,这里不是括号了,是中括号,因为这里是map
  12. for _, f := range files {
  13. log.Println(f.Filename) //日志打印文件名
  14. dst := path.Join("./static", f.Filename) //存储目录static
  15. c.SaveUploadedFile(f, dst) //存储
  16. c.JSON(http.StatusOK, gin.H{ //返回上传成功提示
  17. "message": "upload succeed",
  18. })
  19. }
  20. }
  21. func main() {
  22. router := gin.Default() //定义默认路由
  23. router.POST("/upload", uploadfiles) //多文件上传
  24. router.Run(":9090") //绑定0.0.0.0:9090
  25. }