webdav.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // webdav
  2. // 远程文件下载
  3. package main
  4. import (
  5. "fmt"
  6. "log"
  7. "path/filepath"
  8. "strings"
  9. "time"
  10. "github.com/studio-b12/gowebdav"
  11. )
  12. var filenum = 0
  13. // 获取数据目录
  14. func getRemoteFilePath(webdav, user, secert, remote string) {
  15. log.Println("准备下载 ", remote, cf.YusuanInfo)
  16. client := gowebdav.NewAuthClient(webdav, gowebdav.NewAutoAuth(user, secert))
  17. client.Connect()
  18. // 获取根目录列表
  19. entries, err := client.ReadDir(remote)
  20. if err != nil {
  21. log.Fatal(err)
  22. }
  23. // 遍历目录结构
  24. for _, entry := range entries {
  25. log.Println(remote + "/" + entry.Name())
  26. if entry.IsDir() {
  27. // 如果是目录,则递归遍历子目录
  28. readDirRecursive(client, remote+"/"+entry.Name())
  29. }
  30. }
  31. log.Println(fmt.Sprintf("读取文件总数量为:%d", filenum))
  32. }
  33. // 递归遍历目录结构
  34. func readDirRecursive(client *gowebdav.Client, path string) {
  35. entries, err := client.ReadDir(path)
  36. if err != nil {
  37. log.Fatal(err)
  38. }
  39. for _, entry := range entries {
  40. if entry.IsDir() {
  41. // 如果是目录,则递归遍历子目录
  42. readDirRecursive(client, path+"/"+entry.Name())
  43. } else {
  44. if filenum%1000 == 0 {
  45. log.Println(fmt.Sprintf("已读取文件数量:%d,当前路径为:%s", filenum, path))
  46. }
  47. filenum++
  48. file_path := path + "/" + entry.Name()
  49. log.Println(file_path)
  50. sp1 := strings.Split(file_path, "/")
  51. sp2 := strings.Split(entry.Name(), ".")
  52. if len(sp2) < 2 || len(sp1) < 3 {
  53. db.Update(fmt.Sprintf("%s_err", cf.YusuanInfo),
  54. map[string]interface{}{"file_path": file_path},
  55. map[string]interface{}{
  56. "$set": map[string]interface{}{
  57. "file_name": entry.Name(),
  58. "file_path": file_path,
  59. }},
  60. true,
  61. false,
  62. )
  63. } else {
  64. db.Update(cf.YusuanInfo,
  65. map[string]interface{}{"file_path": file_path},
  66. map[string]interface{}{
  67. "$set": map[string]interface{}{
  68. "file_name": entry.Name(),
  69. "file_path": file_path,
  70. "file_size": entry.Size(),
  71. "file_time": entry.ModTime().Format("2006-01-02 15:04:05"),
  72. "file_type": sp2[1],
  73. "year": sp1[0],
  74. "area": sp1[1],
  75. "city": sp1[2],
  76. "updatetime": time.Now().Unix(),
  77. // "publish_org_type":
  78. }},
  79. true,
  80. false,
  81. )
  82. }
  83. }
  84. }
  85. }
  86. // downloadRemoteExcelFile
  87. func downloadRemoteExcelFile(webdav, user, secert, remote string) {
  88. log.Println("准备下载 ", remote)
  89. // //TODO 创建本地目录
  90. // dir, err := os.Getwd()
  91. // if err != nil {
  92. // log.Println(err)
  93. // return
  94. // }
  95. // path := filepath.Join(dir, "attaches")
  96. // if _, err := os.Stat(path); err != nil {
  97. // os.MkdirAll(path, 0777)
  98. // }
  99. client := gowebdav.NewAuthClient(webdav, gowebdav.NewAutoAuth(user, secert))
  100. client.Connect()
  101. fs, err := client.ReadDir(remote)
  102. if err != nil {
  103. log.Println(err)
  104. return
  105. }
  106. for _, f := range fs {
  107. fn := f.Name()
  108. ext := strings.ToLower(filepath.Ext(fn))
  109. if ext == ".xls" || ext == ".xlsx" {
  110. fpath := strings.ReplaceAll(filepath.Join(remote, fn), "\\", "/")
  111. log.Println(fpath)
  112. // reader, err := client.ReadStream(fpath)
  113. // if err != nil {
  114. // log.Println(err)
  115. // continue
  116. // }
  117. // fo, err := os.OpenFile(filepath.Join(path, fn), os.O_CREATE|os.O_RDWR|os.O_SYNC|os.O_TRUNC, 0777)
  118. // if err != nil {
  119. // log.Println(err)
  120. // continue
  121. // }
  122. // io.Copy(fo, reader)
  123. // reader.Close()
  124. // fo.Close()
  125. } else {
  126. log.Println("跳过 " + fn)
  127. }
  128. }
  129. log.Println("下载完成")
  130. //reloadFilelistData()
  131. }