• Go图片文件按照时间戳如何排序


    涉及点包括

    文件创建;时间控制器;自建封装包以及方法;

    模板渲染;路由配置;不同的数据类型之间的转换拼接;

    对于之前进行的文件上传操作,囊括单文件以及同名多文件和非同名多文件的编程方法,在生产中会遇到一个问题,如果上传的图片是同名的,那么在单文件上传的时候会将其覆盖;

    那么如果通过时间来对上传的文件进行排序,且判断其是否是我们需要的文件呢?

     对于重复性的图片上传,但是需要按照时间来进行排列很不友好;且会进行覆盖;

    解决方法如下:

    获取上传的文件

    获取后缀名 判断类型是否正确.jpg .png .gif .jpeg

    创建图片保存目录

    生成文件名称和文件保存的目录

    上传

     1、封装一个时间的方法包

    供我们后面的时间使用

    1. package models
    2. import (
    3. "time"
    4. )
    5. //时间戳转换成日期
    6. func UnixToTime(timestamp int) string {
    7. t := time.Unix(int64(timestamp), 0)
    8. return t.Format("2006-01-02 15:04:05")
    9. }
    10. //日期转换成时间戳 2020-05-02 15:04:05
    11. func DateToUnix(str string) int64 {
    12. template := "2006-01-02 15:04:05"
    13. t, err := time.ParseInLocation(template, str, time.Local)
    14. if err != nil {
    15. return 0
    16. }
    17. return t.Unix()
    18. }
    19. //获取时间戳
    20. func GetUnix() int64 {
    21. return time.Now().Unix()
    22. }
    23. //获取当前的日期
    24. func GetDate() string {
    25. template := "2006-01-02 15:04:05"
    26. return time.Now().Format(template)
    27. }
    28. //获取年月日
    29. func GetDay() string {
    30. template := "20060102"
    31. return time.Now().Format(template)
    32. }

     2、渲染模板

    1. {{ define "admin/useradd.html" }}
    2. html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    8. <title>FileUploadtesttitle>
    9. head>
    10. <body>
    11. <h2>----Gin 图片安装日期排序测试----h2>
    12. <form action="/admin/user/fileUpload" method="post" enctype="multipart/form-data">
    13. 用户名:<input type="text" name="username" placeholder="用户名" />
    14. <br>
    15. <br>
    16. 人物像1:<input type="file" name="photo" />
    17. <br> <br>
    18. <input type="submit" value="提交">
    19. form>
    20. body>
    21. html>
    22. {{ end }}

     3、控制器配置(多个步骤)

    1、获取上传的文件

    FormFile返回所提供的表单键的第一个文件。 

    2、获取后缀名 判断类型是否正确

    ext返回path使用的文件扩展名。扩展名是从path的最后一个斜杠分隔元素的最后一个点开始的后缀,如果没有点,则为空。

    3、创建图片保存目录

    mkdirAll创建一个名为path的目录以及任何必要的父目录,并返nil,否则返回错误。权限位perm(在umask之前)用于MkdirAll创建的所有目录。如果path已经是一个目录,MkdirAll不执行任何操作并返回nil。

    4、生成文件名称和文件保存的目录,时间戳形式保存文件 

    formatint在给定的基中返回的字符串表示形式,对于2<=base<=36。结果使用小写字母a到'"表示>=10的数字值。

     5、代码如下

    1. package admin
    2. import (
    3. "fmt"
    4. "gindemo04/models"
    5. "net/http"
    6. "os"
    7. "path"
    8. "strconv"
    9. "github.com/gin-gonic/gin"
    10. )
    11. type UserAddController struct {
    12. BaseController
    13. }
    14. func (con UserAddController) Add(c *gin.Context) {
    15. c.HTML(http.StatusOK, "admin/useradd.html", gin.H{})
    16. }
    17. func (con UserAddController) FileUpload(c *gin.Context) {
    18. username := c.PostForm("username")
    19. // 1、获取上传的文件
    20. file,err := c.FormFile("photo")
    21. if err == nil{
    22. // 2、获取后缀名 判断类型是否正确.jpg .png .gif .jpeg
    23. //path方法内的ext可以获取文件的后缀名称
    24. extName :=path.Ext(file.Filename)
    25. //做一个map来获取这些值
    26. trueExt := map[string]bool{
    27. ".jpg" :true,
    28. ".png" :true,
    29. ".gif" :true,
    30. ".jpeg" :true,
    31. }
    32. //拿出k的值(文件后缀)来判断value(bool值)
    33. if _ ,ok := trueExt[extName] ;!ok{
    34. c.String(http.StatusOK,"非指定后缀类型,上传失败")
    35. return
    36. }
    37. // 3、创建图片保存目录 static/images/20290829
    38. day := models.GetDay()
    39. dir := "./static/images/" + day
    40. err := os.MkdirAll(dir, 0666)
    41. if err != nil{
    42. fmt.Print(err)
    43. c.String(http.StatusOK,"创建文件失败")
    44. return
    45. }
    46. // 4、生成文件名称和文件保存的目录,时间戳形式保存文件(21312143432.jpg的类型)
    47. unix:= models.GetUnix()
    48. //修改unix的格式,它是int64的没法和string进行拼接
    49. fileName := strconv.FormatInt(unix,10) + extName
    50. // 5、执行上传
    51. dest := path.Join(dir, fileName)
    52. c.SaveUploadedFile(file,dest)
    53. }
    54. c.JSON(http.StatusOK, gin.H{
    55. "success": true,
    56. "username": username,
    57. })
    58. }

    4、路由配置

    1. package routers
    2. import (
    3. "gindemo04/controllers/admin"
    4. "gindemo04/middle"
    5. "github.com/gin-gonic/gin"
    6. )
    7. func AdminRoutersInit(r *gin.Engine) {
    8. //middlewares.InitMiddleware中间件
    9. adminRouters := r.Group("/admin", middle.InitMiddleware)
    10. {
    11. adminRouters.GET("/", admin.IndexController{}.Index)
    12. adminRouters.GET("/user", admin.UserAddController{}.Index)
    13. adminRouters.GET("/user/add", admin.UserAddController{}.Add)
    14. adminRouters.POST("/user/fileUpload", admin.UserAddController{}.FileUpload)
    15. adminRouters.GET("/article", admin.ArticleController{}.Index)
    16. adminRouters.GET("/article/add", admin.ArticleController{}.Add)
    17. adminRouters.GET("/article/edit", admin.ArticleController{}.Edit)
    18. }
    19. }

    5、测试

     

    这样即便一样的图片也不会覆盖且还可以记录时间

  • 相关阅读:
    蓝蓝设计为教育行业提供软件UI交互设计服务
    推特爆火!超越ChatGPT和Llama2,新一代检索增强方法Self-RAG来了原创
    了解XSS攻击与CSRF攻击
    初学者程序员要学好.Net,只要学习这几个框架就够了
    Jetson-XAVIAR NX 上编译tensorflow-lite
    使用python将网页下载为pdf
    Map接口
    Python元类(metaclass)
    PyTorch中的动态学习率
    Codeforces Round #812 (Div. 2)
  • 原文地址:https://blog.csdn.net/m0_72264240/article/details/133747806