exa_simple_uploader.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "gin-vue-admin/global"
  6. "gin-vue-admin/model"
  7. "gorm.io/gorm"
  8. "io/ioutil"
  9. "os"
  10. "strconv"
  11. )
  12. // 保存文件切片路径
  13. func SaveChunk(uploader model.ExaSimpleUploader) (err error) {
  14. return global.GVA_DB.Create(uploader).Error
  15. }
  16. // 检查文件是否已经上传过
  17. func CheckFileMd5(md5 string) (err error, uploads []model.ExaSimpleUploader, isDone bool) {
  18. err = global.GVA_DB.Find(&uploads, "identifier = ? AND is_done = ?", md5, false).Error
  19. isDone = errors.Is(global.GVA_DB.First(&model.ExaSimpleUploader{}, "identifier = ? AND is_done = ?", md5, true).Error, gorm.ErrRecordNotFound)
  20. return err, uploads, !isDone
  21. }
  22. // 合并文件
  23. func MergeFileMd5(md5 string, fileName string) (err error) {
  24. finishDir := "./finish/"
  25. dir := "./chunk/" + md5
  26. //如果文件上传成功 不做后续操作 通知成功即可
  27. if !errors.Is(global.GVA_DB.First(&model.ExaSimpleUploader{}, "identifier = ? AND is_done = ?", md5, true).Error, gorm.ErrRecordNotFound) {
  28. return nil
  29. }
  30. //打开切片文件夹
  31. rd, err := ioutil.ReadDir(dir)
  32. _ = os.MkdirAll(finishDir, os.ModePerm)
  33. //创建目标文件
  34. fd, err := os.OpenFile(finishDir+fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
  35. if err != nil {
  36. return
  37. }
  38. //关闭文件
  39. defer fd.Close()
  40. //将切片文件按照顺序写入
  41. for k := range rd {
  42. content, _ := ioutil.ReadFile(dir + "/" + fileName + strconv.Itoa(k+1))
  43. _, err = fd.Write(content)
  44. if err != nil {
  45. _ = os.Remove(finishDir + fileName)
  46. }
  47. }
  48. if err != nil {
  49. return err
  50. }
  51. //创建事务
  52. tx := global.GVA_DB.Begin()
  53. //删除切片信息
  54. err = tx.Delete(&model.ExaSimpleUploader{}, "identifier = ? AND is_done = ?", md5, false).Error
  55. // 添加文件信息
  56. if err != nil {
  57. fmt.Println(err)
  58. tx.Rollback()
  59. }
  60. err = tx.Create(&model.ExaSimpleUploader{
  61. Identifier: md5,
  62. IsDone: true,
  63. FilePath: finishDir + fileName,
  64. Filename: fileName,
  65. }).Error
  66. if err != nil {
  67. fmt.Println(err)
  68. tx.Rollback()
  69. }
  70. tx.Commit()
  71. //清除切片
  72. err = os.RemoveAll(dir)
  73. return
  74. }