client.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package client
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "io"
  7. "log"
  8. "mime/multipart"
  9. "net/http"
  10. "net/rpc"
  11. "strconv"
  12. "app.yhyue.com/moapp/jybase/api"
  13. "jygit.jydev.jianyu360.cn/BaseService/ossService/client/constant"
  14. "jygit.jydev.jianyu360.cn/BaseService/ossService/client/entity"
  15. )
  16. /* restful方式上传
  17. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  18. * @param bucketId 桶id
  19. * @param objectName 对象名称
  20. * @param stream 文件流
  21. * @param gzip 是否压缩
  22. * @return {"error_code":0,"error_msg":"上传成功"}
  23. */
  24. func UpLoadByRestful(domain, bucketId, objectName string, stream []byte, gzip bool) (reply *api.Result) {
  25. reply = &api.Result{Error_code: -1}
  26. // 创建一个缓冲区来存储表单数据
  27. body := &bytes.Buffer{}
  28. writer := multipart.NewWriter(body)
  29. writer.WriteField("bucket_id", bucketId)
  30. writer.WriteField("object_name", objectName)
  31. writer.WriteField("gzip", strconv.FormatBool(gzip))
  32. // 创建表单字段
  33. part, err := writer.CreateFormFile("file", objectName)
  34. if err != nil {
  35. reply.Error_msg = err.Error()
  36. return
  37. }
  38. // 模拟文件流
  39. fileStream := bytes.NewReader(stream)
  40. // 将文件流复制到表单字段
  41. _, err = io.Copy(part, fileStream)
  42. if err != nil {
  43. reply.Error_msg = err.Error()
  44. return
  45. }
  46. // 创建 HTTP 请求
  47. if respBody, err := post(domain+constant.UploadUrl, writer, body); err != nil {
  48. reply.Error_msg = err.Error()
  49. } else {
  50. json.Unmarshal(respBody, &reply)
  51. }
  52. return
  53. }
  54. /* restful方式下载
  55. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  56. * @param bucketId 桶id
  57. * @param objectName 对象名称
  58. * @return {"error_code":0,"error_msg":"下载成功"}
  59. */
  60. func DownloadByRestful(domain, bucketId, objectName string) (reply *api.Result) {
  61. reply = &api.Result{}
  62. // 创建一个缓冲区来存储表单数据
  63. body := &bytes.Buffer{}
  64. writer := multipart.NewWriter(body)
  65. writer.WriteField("bucket_id", bucketId)
  66. writer.WriteField("object_name", objectName)
  67. if respBody, err := post(domain+constant.DownloadUrl, writer, body); err != nil {
  68. reply.Error_msg = err.Error()
  69. } else {
  70. reply.Error_msg = constant.DownloadSuccess
  71. reply.Data = respBody
  72. }
  73. return
  74. }
  75. /* restful方式删除
  76. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  77. * @param bucketId 桶id
  78. * @param objectName 对象名称
  79. * @return {"error_code":0,"error_msg":"上传成功"}
  80. */
  81. func DeleteByRestful(domain, bucketId, objectName string) (reply *api.Result) {
  82. reply = &api.Result{}
  83. // 创建一个缓冲区来存储表单数据
  84. body := &bytes.Buffer{}
  85. writer := multipart.NewWriter(body)
  86. writer.WriteField("bucket_id", bucketId)
  87. writer.WriteField("object_name", objectName)
  88. if respBody, err := post(domain+constant.DeleteUrl, writer, body); err != nil {
  89. reply.Error_msg = err.Error()
  90. } else {
  91. json.Unmarshal(respBody, &reply)
  92. }
  93. return
  94. }
  95. /* restful方式获取标讯正文
  96. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  97. * @param bucketId 桶id
  98. * @param objectName 对象名称
  99. * @return {"error_code":0,"error_msg":"获取正文成功","data":"正文内容"}
  100. */
  101. func GetBidDetailByRestful(domain, bucketId, objectName string) (reply *api.Result) {
  102. reply = &api.Result{}
  103. // 创建一个缓冲区来存储表单数据
  104. body := &bytes.Buffer{}
  105. writer := multipart.NewWriter(body)
  106. writer.WriteField("bucket_id", bucketId)
  107. writer.WriteField("object_name", objectName)
  108. if respBody, err := post(domain+constant.GetBidDetailUrl, writer, body); err != nil {
  109. reply.Error_msg = err.Error()
  110. } else {
  111. reply.Error_msg = constant.GetBidDetailSuccess
  112. reply.Data = string(respBody)
  113. }
  114. return
  115. }
  116. func post(url string, writer *multipart.Writer, body *bytes.Buffer) ([]byte, error) {
  117. // 关闭表单写入器
  118. if err := writer.Close(); err != nil {
  119. return nil, err
  120. }
  121. // 创建 HTTP 请求
  122. req, err := http.NewRequest("POST", url, body)
  123. if err != nil {
  124. log.Println("Error creating request:", err)
  125. return nil, err
  126. }
  127. // 设置请求头
  128. req.Header.Set("Content-Type", writer.FormDataContentType())
  129. // 发送请求
  130. client := &http.Client{}
  131. resp, err := client.Do(req)
  132. if err != nil {
  133. return nil, err
  134. }
  135. defer resp.Body.Close()
  136. // 读取响应
  137. respBody, err := io.ReadAll(resp.Body)
  138. if err != nil {
  139. return nil, err
  140. }
  141. if resp.StatusCode != http.StatusOK {
  142. return nil, errors.New(string(respBody))
  143. }
  144. return respBody, nil
  145. }
  146. /* rpc方式上传
  147. * @param address 域名,例如:192.168.3.206:8110
  148. * @param args 参数
  149. * @param args.BucketID 文件名
  150. * @param args.objectName 对象名称
  151. * @param args.Stream 文件流
  152. * @param args.Gzip 是否压缩
  153. * @return {"error_code":0,"error_msg":"上传成功"}
  154. * @return error 错误信息
  155. */
  156. func UpLoadByRpc(address string, args *entity.UploadArgs) (api.Result, error) {
  157. var reply api.Result
  158. err := rpcCall(address, "OSSService.Upload", args, &reply)
  159. return reply, err
  160. }
  161. /*
  162. *rpc方式下载
  163. * @param address 域名,例如:192.168.3.206:8110
  164. * @param args 参数
  165. * @param args.BucketID 文件名
  166. * @param args.objectName 对象名称
  167. * @return {"error_code":0,"error_msg":"下载成功","data":"文件流"}
  168. * @return error 错误信息
  169. */
  170. func DownloadByRpc(address string, args *entity.Args) (api.Result, error) {
  171. var reply api.Result
  172. err := rpcCall(address, "OSSService.Download", args, &reply)
  173. return reply, err
  174. }
  175. /* rpc方式删除
  176. * @param address 域名,例如:192.168.3.206:8110
  177. * @param args 参数
  178. * @param args.BucketID 文件名
  179. * @param args.objectName 对象名称
  180. * @return {"error_code":0,"error_msg":"删除成功"}
  181. * @return error 错误信息
  182. */
  183. func DeleteByRpc(address string, args *entity.Args) (api.Result, error) {
  184. var reply api.Result
  185. err := rpcCall(address, "OSSService.Delete", args, &reply)
  186. return reply, err
  187. }
  188. /*
  189. *rpc方式获取标讯正文
  190. * @param address 域名,例如:192.168.3.206:8110
  191. * @param args 参数
  192. * @param args.BucketID 文件名
  193. * @param args.objectName 对象名称
  194. * @return {"error_code":0,"error_msg":"下载成功","data":"正文内容"}
  195. * @return error 错误信息
  196. */
  197. func GetBidDetailByRpc(address string, args *entity.Args) (api.Result, error) {
  198. var reply api.Result
  199. err := rpcCall(address, "OSSService.GetBidDetail", args, &reply)
  200. return reply, err
  201. }
  202. func rpcCall(address, serviceMethod string, args any, reply any) error {
  203. client, err := rpc.DialHTTP("tcp", address)
  204. if err != nil {
  205. log.Println(err)
  206. return err
  207. }
  208. defer client.Close()
  209. err = client.Call(serviceMethod, args, reply)
  210. if err != nil {
  211. log.Println(err)
  212. return err
  213. }
  214. return nil
  215. }