simulation_service.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package simulation_service
  2. import (
  3. "archive/zip"
  4. "context"
  5. "fmt"
  6. "github.com/cloudwego/hertz/pkg/app"
  7. "io"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. "pji_desktop_http/biz/dal/mysql"
  12. "pji_desktop_http/common/config"
  13. "pji_desktop_http/common/config/c_log"
  14. "pji_desktop_http/common/util"
  15. )
  16. // DownloadSimulationZipFile 根据请求id从oss拉取并打包仿真测试所需要的文件
  17. // @router /simulation/download/zipfile [GET]
  18. func DownloadSimulationZipFile(ctx context.Context, c *app.RequestContext) {
  19. id := c.Query("id")
  20. fmt.Println(id)
  21. // 根据id生成用于地图更新的压缩包
  22. filePath, tmpDir, err := generateSimulationZipById(ctx, id)
  23. if err != nil {
  24. c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
  25. }
  26. fmt.Println("filePath", filePath)
  27. // 检查文件是否存在
  28. if _, err := os.Stat(filePath); os.IsNotExist(err) {
  29. c.JSON(http.StatusNotFound, map[string]string{"error": "File not found"})
  30. return
  31. }
  32. // 打开文件
  33. f, err := os.Open(filePath)
  34. if err != nil {
  35. c.JSON(http.StatusInternalServerError, map[string]string{"error": "Failed to open file"})
  36. return
  37. }
  38. defer f.Close()
  39. // 设置响应头
  40. c.Response.Header.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filepath.Base(filePath)))
  41. c.Response.Header.Set("Content-Type", "binary/octet-stream")
  42. // 将文件流式传输回客户端
  43. data, err := io.ReadAll(f)
  44. if err != nil {
  45. panic(err)
  46. }
  47. if _, err := c.Write(data); err != nil {
  48. c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()})
  49. return
  50. }
  51. defer os.RemoveAll(tmpDir)
  52. }
  53. // 根据id生成用于仿真测试的压缩包
  54. func generateSimulationZipById(ctx context.Context, id string) (file string, tmpDir string, err error) {
  55. // 根据id获取对应的oss文件列表
  56. allFileList, err := util.GetExactedMapFileById(id)
  57. //fmt.Println("Filtered Strings:", fileList)
  58. if err != nil {
  59. return
  60. }
  61. // 创建临时文件夹
  62. tmpDir, err = os.MkdirTemp("", "temp-download-*")
  63. fmt.Println("tmpDir:", tmpDir)
  64. if err != nil {
  65. fmt.Println("Error creating temporary directory:", err)
  66. return "", "", err
  67. }
  68. c_log.GlobalLogger.Info("创建下载-临时文件夹:", tmpDir)
  69. // 创建根文件夹(文件打包的根目录)
  70. baseDir := filepath.Join(tmpDir, "data")
  71. if err := os.Mkdir(baseDir, 0755); err != nil {
  72. fmt.Println("Error creating subdirectory:", err)
  73. return "", "", err
  74. }
  75. c_log.GlobalLogger.Info("创建文件打包根目录:", baseDir)
  76. // 从oss下载data.zip文件到根目录(data.zip中的mapBuf文件夹包含map.pgm, map.yaml)
  77. // 过滤特定后缀的文件列表
  78. simulationFileList := util.FilterBySuffixes(allFileList, config.SimulationFiltersuffixes...)
  79. // 从oss下载文件到 根目录
  80. for _, file := range simulationFileList {
  81. err = config.OssBucket.GetObjectToFile(file, filepath.Join(baseDir, filepath.Base(file)))
  82. if err != nil {
  83. fmt.Println("Error downloading mapBuf file:", err)
  84. return "", "", err
  85. }
  86. }
  87. c_log.GlobalLogger.Info("下载data.zip文件到根目录 - 成功")
  88. // 下载world文件
  89. // 查询状态
  90. world, err := mysql.QueryWorld(ctx, id)
  91. if err != nil || world == nil { // 文件不存在
  92. c_log.GlobalLogger.Info("world文件不存在 - 跳过")
  93. } else { // 文件存在
  94. // 下载文件
  95. worldURL := world.WorldURL
  96. err = config.OssBucket.GetObjectToFile(worldURL, filepath.Join(baseDir, filepath.Base(worldURL)))
  97. if err != nil {
  98. fmt.Println("Error downloading world file:", err)
  99. return "", "", err
  100. }
  101. c_log.GlobalLogger.Info("下载world文件到根目录 - 成功")
  102. }
  103. // 创建压缩文件
  104. zipPath := filepath.Join(tmpDir, "simulationFile-"+id+".zip")
  105. zipFile, err := os.Create(zipPath)
  106. if err != nil {
  107. fmt.Println("Error creating ZIP file:", err)
  108. return "", "", err
  109. }
  110. defer zipFile.Close()
  111. zipWriter := zip.NewWriter(zipFile)
  112. defer zipWriter.Close()
  113. // 压缩文件夹
  114. if err := util.AddDirToZip(baseDir, zipWriter); err != nil {
  115. fmt.Println("Error adding directory to ZIP:", err)
  116. return "", "", err
  117. }
  118. fmt.Println("ZIP file created successfully.")
  119. c_log.GlobalLogger.Info("创建压缩文件 - 成功")
  120. return zipPath, tmpDir, nil
  121. }