exa_simple_uploader.go 1.9 KB

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