文件创建;时间控制器;自建封装包以及方法;
模板渲染;路由配置;不同的数据类型之间的转换拼接;
对于之前进行的文件上传操作,囊括单文件以及同名多文件和非同名多文件的编程方法,在生产中会遇到一个问题,如果上传的图片是同名的,那么在单文件上传的时候会将其覆盖;
那么如果通过时间来对上传的文件进行排序,且判断其是否是我们需要的文件呢?
对于重复性的图片上传,但是需要按照时间来进行排列很不友好;且会进行覆盖;
获取上传的文件
获取后缀名 判断类型是否正确.jpg .png .gif .jpeg
创建图片保存目录
生成文件名称和文件保存的目录
上传
供我们后面的时间使用
- package models
-
- import (
- "time"
- )
-
- //时间戳转换成日期
- func UnixToTime(timestamp int) string {
- t := time.Unix(int64(timestamp), 0)
- return t.Format("2006-01-02 15:04:05")
- }
- //日期转换成时间戳 2020-05-02 15:04:05
- func DateToUnix(str string) int64 {
- template := "2006-01-02 15:04:05"
- t, err := time.ParseInLocation(template, str, time.Local)
- if err != nil {
- return 0
- }
- return t.Unix()
- }
-
- //获取时间戳
- func GetUnix() int64 {
- return time.Now().Unix()
- }
-
- //获取当前的日期
- func GetDate() string {
- template := "2006-01-02 15:04:05"
- return time.Now().Format(template)
- }
-
- //获取年月日
- func GetDay() string {
- template := "20060102"
- return time.Now().Format(template)
- }
- {{ define "admin/useradd.html" }}
-
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>FileUploadtesttitle>
- head>
- <body>
- <h2>----Gin 图片安装日期排序测试----h2>
-
- <form action="/admin/user/fileUpload" method="post" enctype="multipart/form-data">
-
- 用户名:<input type="text" name="username" placeholder="用户名" />
- <br>
- <br>
- 人物像1:<input type="file" name="photo" />
- <br> <br>
- <input type="submit" value="提交">
- form>
- body>
- html>
- {{ end }}
FormFile返回所提供的表单键的第一个文件。
ext返回path使用的文件扩展名。扩展名是从path的最后一个斜杠分隔元素的最后一个点开始的后缀,如果没有点,则为空。
mkdirAll创建一个名为path的目录以及任何必要的父目录,并返nil,否则返回错误。权限位perm(在umask之前)用于MkdirAll创建的所有目录。如果path已经是一个目录,MkdirAll不执行任何操作并返回nil。
formatint在给定的基中返回的字符串表示形式,对于2<=base<=36。结果使用小写字母a到'"表示>=10的数字值。
- package admin
-
- import (
- "fmt"
- "gindemo04/models"
- "net/http"
- "os"
- "path"
- "strconv"
-
- "github.com/gin-gonic/gin"
- )
-
- type UserAddController struct {
- BaseController
- }
-
- func (con UserAddController) Add(c *gin.Context) {
- c.HTML(http.StatusOK, "admin/useradd.html", gin.H{})
- }
-
- func (con UserAddController) FileUpload(c *gin.Context) {
- username := c.PostForm("username")
- // 1、获取上传的文件
- file,err := c.FormFile("photo")
- if err == nil{
- // 2、获取后缀名 判断类型是否正确.jpg .png .gif .jpeg
- //path方法内的ext可以获取文件的后缀名称
- extName :=path.Ext(file.Filename)
- //做一个map来获取这些值
- trueExt := map[string]bool{
- ".jpg" :true,
- ".png" :true,
- ".gif" :true,
- ".jpeg" :true,
- }
- //拿出k的值(文件后缀)来判断value(bool值)
- if _ ,ok := trueExt[extName] ;!ok{
- c.String(http.StatusOK,"非指定后缀类型,上传失败")
- return
- }
- // 3、创建图片保存目录 static/images/20290829
- day := models.GetDay()
- dir := "./static/images/" + day
- err := os.MkdirAll(dir, 0666)
- if err != nil{
- fmt.Print(err)
- c.String(http.StatusOK,"创建文件失败")
- return
- }
- // 4、生成文件名称和文件保存的目录,时间戳形式保存文件(21312143432.jpg的类型)
- unix:= models.GetUnix()
- //修改unix的格式,它是int64的没法和string进行拼接
- fileName := strconv.FormatInt(unix,10) + extName
-
- // 5、执行上传
- dest := path.Join(dir, fileName)
- c.SaveUploadedFile(file,dest)
- }
-
- c.JSON(http.StatusOK, gin.H{
- "success": true,
- "username": username,
- })
- }
-
- package routers
-
- import (
- "gindemo04/controllers/admin"
- "gindemo04/middle"
-
- "github.com/gin-gonic/gin"
- )
-
- func AdminRoutersInit(r *gin.Engine) {
- //middlewares.InitMiddleware中间件
- adminRouters := r.Group("/admin", middle.InitMiddleware)
- {
- adminRouters.GET("/", admin.IndexController{}.Index)
-
- adminRouters.GET("/user", admin.UserAddController{}.Index)
-
- adminRouters.GET("/user/add", admin.UserAddController{}.Add)
- adminRouters.POST("/user/fileUpload", admin.UserAddController{}.FileUpload)
-
-
-
- adminRouters.GET("/article", admin.ArticleController{}.Index)
- adminRouters.GET("/article/add", admin.ArticleController{}.Add)
- adminRouters.GET("/article/edit", admin.ArticleController{}.Edit)
- }
- }
这样即便一样的图片也不会覆盖且还可以记录时间