file.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package admin
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "log"
  5. "net/http"
  6. "os"
  7. "server/dao"
  8. "server/global"
  9. "server/model/common/response"
  10. "strings"
  11. )
  12. type FileApi struct{}
  13. func (fa *FileApi) QueryFileGenre(c *gin.Context) {
  14. genre, err := fileService.QueryFileGenre()
  15. if err != nil {
  16. response.FailWithMessage("失败", c)
  17. global.GVA_LOG.Error("QueryFileGenre ======= " + err.Error())
  18. return
  19. }
  20. response.OkWithData(genre, c)
  21. }
  22. func (fa *FileApi) CreateFileGenre(c *gin.Context) {
  23. var fileGenre dao.FileGenre
  24. err := c.ShouldBindJSON(&fileGenre)
  25. if err != nil {
  26. response.FailWithMessage("失败", c)
  27. global.GVA_LOG.Error("CreateFileGenre ====== " + err.Error())
  28. return
  29. }
  30. err = fileService.CreateFileGenre(fileGenre)
  31. if err != nil {
  32. response.FailWithMessage("失败", c)
  33. global.GVA_LOG.Error("CreateFileGenre ====== " + err.Error())
  34. return
  35. }
  36. response.OkWithMessage("新增成功", c)
  37. }
  38. func (fa *FileApi) UpdateFileGenre(c *gin.Context) {
  39. var fileGenre dao.FileGenre
  40. err := c.ShouldBindJSON(&fileGenre)
  41. if err != nil {
  42. response.FailWithMessage("失败", c)
  43. global.GVA_LOG.Error("UpdateFileGenre ====== " + err.Error())
  44. return
  45. }
  46. err = fileService.UpdateFileGenre(fileGenre)
  47. if err != nil {
  48. response.FailWithMessage("失败", c)
  49. global.GVA_LOG.Error("UpdateFileGenre ====== " + err.Error())
  50. return
  51. }
  52. response.OkWithMessage("修改成功", c)
  53. }
  54. func (fa *FileApi) DeleteFileGenre(c *gin.Context) {
  55. var fileGenre dao.FileGenre
  56. err := c.ShouldBindJSON(&fileGenre)
  57. if err != nil {
  58. response.FailWithMessage("失败", c)
  59. global.GVA_LOG.Error("DeleteFileGenre ====== " + err.Error())
  60. return
  61. }
  62. err = fileService.DeleteFileGenre(fileGenre)
  63. if err != nil {
  64. response.FailWithMessage("失败", c)
  65. global.GVA_LOG.Error("DeleteFileGenre ====== " + err.Error())
  66. return
  67. }
  68. response.OkWithMessage("删除成功", c)
  69. }
  70. func (fa *FileApi) FileDownload(c *gin.Context) {
  71. path := c.Query("path")
  72. name := c.Query("name")
  73. // 验证或清理文件路径(这里只是一个简单的示例)
  74. if strings.Contains(path, "..") {
  75. response.FailWithMessage("无效的路径", c)
  76. log.Println("检测到可能的路径遍历攻击尝试")
  77. return
  78. }
  79. _, err := os.Stat(path)
  80. if err != nil {
  81. // 如果出现错误,可能是文件或目录不存在
  82. if os.IsNotExist(err) {
  83. c.JSON(http.StatusNotFound, gin.H{"error": "文件不存在"})
  84. return
  85. }
  86. // 其他错误处理
  87. c.AbortWithError(http.StatusInternalServerError, err)
  88. return
  89. }
  90. c.Header("Content-Type", "application/octet-stream") // 表示是文件流,唤起浏览器下载,一般设置了这个,就要设置文件名
  91. c.Header("Content-Disposition", "attachment; filename="+name) // 用来指定下载下来的文件名
  92. c.Header("Content-Transfer-Encoding", "binary") // 表示传输过程中的编码形式,乱码问题可能就是因为它
  93. c.File(path)
  94. }