file.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package v1
  2. import (
  3. "context"
  4. "designs/app/common/request"
  5. "designs/global"
  6. "designs/model"
  7. "designs/response"
  8. "fmt"
  9. "github.com/gin-gonic/gin"
  10. "github.com/tencentyun/cos-go-sdk-v5"
  11. "net/http"
  12. "net/url"
  13. "path/filepath"
  14. "time"
  15. )
  16. func FileList(c *gin.Context) {
  17. form := request.Check(c, &struct {
  18. Offset *int `form:"offset" binding:"required"`
  19. Limit *int `form:"limit" binding:"required"`
  20. Search string `form:"search" binding:""`
  21. }{})
  22. query := global.App.DB.Table("file")
  23. if form.Search != "" {
  24. query = query.Where("fileName", "like", "%"+form.Search+"%")
  25. }
  26. var count int64
  27. err := query.Count(&count).Error
  28. if err != nil {
  29. response.Fail(c, 1001, err.Error())
  30. return
  31. }
  32. var files []model.File
  33. err = query.Offset(*form.Offset).Limit(*form.Limit).Scan(&files).Error
  34. if err != nil {
  35. response.Fail(c, 1002, err.Error())
  36. return
  37. }
  38. response.Success(c, gin.H{
  39. "count": count,
  40. "data": files,
  41. })
  42. }
  43. func FileDelete(c *gin.Context) {
  44. form := request.Check(c, &struct {
  45. FileId int `form:"fileId" json:"fileId" binding:"required"`
  46. }{})
  47. var d interface{}
  48. err := global.App.DB.Table("file").Where("id", form.FileId).Delete(d).Error
  49. if err != nil {
  50. response.Fail(c, 2001, err.Error())
  51. return
  52. }
  53. //删除本地文件和云端文件
  54. response.Success(c, gin.H{})
  55. }
  56. func LocalFileToService(c *gin.Context) {
  57. form := request.Check(c, &struct {
  58. FilePath string `form:"filePath" json:"filePath" binding:"required"`
  59. }{})
  60. path, err := FileToService(form.FilePath)
  61. if err != nil {
  62. response.Fail(c, 1004, err.Error())
  63. return
  64. }
  65. now := model.XTime{
  66. Time: time.Now(),
  67. }
  68. //存储到mysql
  69. err = global.App.DB.Table("file").Create(&model.File{
  70. CreatedAt: now,
  71. UpdatedAt: now,
  72. FileName: filepath.Base(form.FilePath),
  73. LocalPath: form.FilePath,
  74. CosPath: path,
  75. }).Error
  76. if err != nil {
  77. response.Fail(c, 2001, err.Error())
  78. return
  79. }
  80. response.Success(c, gin.H{
  81. "file_path": path,
  82. })
  83. }
  84. func FileToService(filePath string) (string, error) {
  85. // 将 examplebucket-1250000000 和 COS_REGION 修改为用户真实的信息
  86. // 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。https://console.cloud.tencent.com/cos5/bucket
  87. // COS_REGION 可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket, 关于地域的详情见 https://cloud.tencent.com/document/product/436/6224
  88. u, _ := url.Parse("https://chunhao-1257323087.cos.ap-shanghai.myqcloud.com")
  89. // 用于 Get Service 查询,默认全地域 service.cos.myqcloud.com
  90. su, _ := url.Parse("https://service.cos.myqcloud.com")
  91. b := &cos.BaseURL{BucketURL: u, ServiceURL: su}
  92. // 1.永久密钥
  93. client := cos.NewClient(b, &http.Client{
  94. Transport: &cos.AuthorizationTransport{
  95. SecretID: "AKIDgQ2TzTq381nQrAJKBC8tSqCNM9lBQTQB", // 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考 https://cloud.tencent.com/document/product/598/37140
  96. SecretKey: "gBVWO4dzCD5qeKoy30phTBi7NXYYM2b0", // 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考 https://cloud.tencent.com/document/product/598/37140
  97. },
  98. })
  99. key := filepath.Base(filePath)
  100. res, _, err := client.Object.Upload(
  101. context.Background(), key, filePath, nil,
  102. )
  103. fmt.Println(res)
  104. if err != nil {
  105. return "", err
  106. }
  107. ourl := client.Object.GetObjectURL(key)
  108. return ourl.Host + ourl.Path, nil
  109. }