uploadfileapi.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // 文件上传模块
  2. // 秒寻科技
  3. // zt 2024-11-14
  4. package uploadfileapi
  5. import (
  6. "errors"
  7. "fmt"
  8. "ipsomc/public"
  9. "net/http"
  10. "strconv"
  11. "time"
  12. "github.com/gin-gonic/gin"
  13. "github.com/gorilla/websocket"
  14. )
  15. // 创建一个websocket实例
  16. var upgrader = websocket.Upgrader{
  17. CheckOrigin: func(r *http.Request) bool {
  18. return true
  19. },
  20. }
  21. type UploadFileApi struct {
  22. }
  23. // 创建web socket
  24. func (obj *UploadFileApi) CreateWebSocketApi(c *gin.Context) error {
  25. //将HTTP连接转换成到WebSocket 连接
  26. ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
  27. if err != nil {
  28. return err
  29. }
  30. //defer ws.Close()
  31. // // 启动一个 goroutine 来从通道中读取消息并发送给客户端
  32. // go func() {
  33. // for {
  34. // //读消息
  35. // if _, _, err := ws.ReadMessage(); err != nil {
  36. // fmt.Println("websocket closed:", err)
  37. // return
  38. // }
  39. // //监听消息通道
  40. // msg, ok := <-public.Gpub_chanWebSocketMsg
  41. // if !ok {
  42. // // 通道已关闭,退出循环
  43. // return
  44. // }
  45. // // 准备要发送的消息
  46. // var response []byte
  47. // if msg.Flag == 2 {
  48. // response = []byte(strconv.Itoa(int(msg.Percent)))
  49. // } else {
  50. // response = []byte("升级失败")
  51. // }
  52. // // 尝试发送消息到客户端
  53. // if err := ws.WriteMessage(websocket.TextMessage, response); err != nil {
  54. // fmt.Println("WriteMessage error:", err)
  55. // return
  56. // }
  57. // }
  58. // }()
  59. //发送消息到客户端
  60. go obj.SendMsgToClient(ws)
  61. return nil
  62. }
  63. // 发消息给客户端
  64. func (obj *UploadFileApi) SendMsgToClient(ws *websocket.Conn) error {
  65. var errMsg string = ""
  66. var flag uint8 = 0
  67. var exitLoop bool = false
  68. for {
  69. //监听消息通道
  70. select {
  71. case msg, ok := <-public.Gpub_chanWebSocketMsg:
  72. if !ok { // 通道已关闭,退出循环
  73. fmt.Println("通道已关闭")
  74. errMsg = "通道已关闭"
  75. exitLoop = true
  76. }
  77. // 准备要发送的消息
  78. var response []byte
  79. if msg.Flag == 2 {
  80. response = []byte(strconv.Itoa(int(msg.Percent)))
  81. } else {
  82. response = []byte("升级失败")
  83. }
  84. // 尝试发送消息到客户端
  85. if err := ws.WriteMessage(websocket.TextMessage, response); err != nil {
  86. fmt.Println("WriteMessage error:", err)
  87. errMsg = "WriteMessage error"
  88. exitLoop = true
  89. }
  90. //升级成功
  91. if msg.Percent >= 100 {
  92. flag = 1
  93. exitLoop = true
  94. }
  95. println(msg.Percent)
  96. case <-time.After(3 * time.Minute): // 超时
  97. fmt.Println("超时")
  98. errMsg = "超时"
  99. exitLoop = true
  100. }
  101. //退出循环
  102. if exitLoop {
  103. break
  104. }
  105. }
  106. if flag == 1 {
  107. ws.Close()
  108. return nil
  109. } else {
  110. ws.Close()
  111. return errors.New(errMsg)
  112. }
  113. }