local.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package upload
  2. import (
  3. "errors"
  4. "io"
  5. "mime/multipart"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. "time"
  10. "go.uber.org/zap"
  11. "server/global"
  12. "server/utils"
  13. )
  14. type Local struct{}
  15. //@author: [piexlmax](https://github.com/piexlmax)
  16. //@author: [ccfish86](https://github.com/ccfish86)
  17. //@author: [SliverHorn](https://github.com/SliverHorn)
  18. //@object: *Local
  19. //@function: UploadFile
  20. //@description: 上传文件
  21. //@param: file *multipart.FileHeader
  22. //@return: string, string, error
  23. func (*Local) UploadFile(file *multipart.FileHeader) (string, string, error) {
  24. // 读取文件后缀
  25. ext := filepath.Ext(file.Filename)
  26. // 读取文件名并加密
  27. name := strings.TrimSuffix(file.Filename, ext)
  28. name = utils.MD5V([]byte(name))
  29. // 拼接新文件名
  30. filename := name + "_" + time.Now().Format("20060102150405") + ext
  31. // 尝试创建此路径
  32. mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.StorePath, os.ModePerm)
  33. if mkdirErr != nil {
  34. global.GVA_LOG.Error("function os.MkdirAll() failed", zap.Any("err", mkdirErr.Error()))
  35. return "", "", errors.New("function os.MkdirAll() failed, err:" + mkdirErr.Error())
  36. }
  37. // 拼接路径和文件名
  38. p := global.GVA_CONFIG.Local.StorePath + "/" + filename
  39. filepath := global.GVA_CONFIG.Local.Path + "/" + filename
  40. f, openError := file.Open() // 读取文件
  41. if openError != nil {
  42. global.GVA_LOG.Error("function file.Open() failed", zap.Any("err", openError.Error()))
  43. return "", "", errors.New("function file.Open() failed, err:" + openError.Error())
  44. }
  45. defer f.Close() // 创建文件 defer 关闭
  46. out, createErr := os.Create(p)
  47. if createErr != nil {
  48. global.GVA_LOG.Error("function os.Create() failed", zap.Any("err", createErr.Error()))
  49. return "", "", errors.New("function os.Create() failed, err:" + createErr.Error())
  50. }
  51. defer out.Close() // 创建文件 defer 关闭
  52. _, copyErr := io.Copy(out, f) // 传输(拷贝)文件
  53. if copyErr != nil {
  54. global.GVA_LOG.Error("function io.Copy() failed", zap.Any("err", copyErr.Error()))
  55. return "", "", errors.New("function io.Copy() failed, err:" + copyErr.Error())
  56. }
  57. return filepath, filename, nil
  58. }
  59. //@author: [piexlmax](https://github.com/piexlmax)
  60. //@author: [ccfish86](https://github.com/ccfish86)
  61. //@author: [SliverHorn](https://github.com/SliverHorn)
  62. //@object: *Local
  63. //@function: DeleteFile
  64. //@description: 删除文件
  65. //@param: key string
  66. //@return: error
  67. func (*Local) DeleteFile(key string) error {
  68. p := global.GVA_CONFIG.Local.StorePath + "/" + key
  69. if strings.Contains(p, global.GVA_CONFIG.Local.StorePath) {
  70. if err := os.Remove(p); err != nil {
  71. return errors.New("本地文件删除失败, err:" + err.Error())
  72. }
  73. }
  74. return nil
  75. }