client.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package client
  2. import (
  3. "app.yhyue.com/moapp/jybase/api"
  4. "bytes"
  5. "encoding/json"
  6. "errors"
  7. "io"
  8. "jygit.jydev.jianyu360.cn/BaseService/ossService/constant"
  9. "jygit.jydev.jianyu360.cn/BaseService/ossService/entity"
  10. "log"
  11. "mime/multipart"
  12. "net/http"
  13. "net/rpc"
  14. "strconv"
  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. * @param fileBt 文件流
  59. * @param gzip 是否压缩
  60. * @return {"error_code":0,"error_msg":"上传成功"}
  61. */
  62. func DownloadByRestful(domain, bucketId, objectName string) (reply *api.Result) {
  63. reply = &api.Result{}
  64. // 创建一个缓冲区来存储表单数据
  65. body := &bytes.Buffer{}
  66. writer := multipart.NewWriter(body)
  67. writer.WriteField("bucket_id", bucketId)
  68. writer.WriteField("object_name", objectName)
  69. if respBody, err := post(domain+constant.DownloadUrl, writer, body); err != nil {
  70. reply.Error_msg = err.Error()
  71. } else {
  72. reply.Data = respBody
  73. }
  74. return
  75. }
  76. /* restful方式删除
  77. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  78. * @param bucketId 桶id
  79. * @param objectName 对象名称
  80. * @param fileBt 文件流
  81. * @param gzip 是否压缩
  82. * @return {"error_code":0,"error_msg":"上传成功"}
  83. */
  84. func DeleteByRestful(domain, bucketId, objectName string) (reply *api.Result) {
  85. reply = &api.Result{}
  86. // 创建一个缓冲区来存储表单数据
  87. body := &bytes.Buffer{}
  88. writer := multipart.NewWriter(body)
  89. writer.WriteField("bucket_id", bucketId)
  90. writer.WriteField("object_name", objectName)
  91. if respBody, err := post(domain+constant.DeleteUrl, writer, body); err != nil {
  92. reply.Error_msg = err.Error()
  93. } else {
  94. json.Unmarshal(respBody, &reply)
  95. }
  96. return
  97. }
  98. func post(url string, writer *multipart.Writer, body *bytes.Buffer) ([]byte, error) {
  99. // 关闭表单写入器
  100. if err := writer.Close(); err != nil {
  101. return nil, err
  102. }
  103. // 创建 HTTP 请求
  104. req, err := http.NewRequest("POST", url, body)
  105. if err != nil {
  106. log.Println("Error creating request:", err)
  107. return nil, err
  108. }
  109. // 设置请求头
  110. req.Header.Set("Content-Type", writer.FormDataContentType())
  111. // 发送请求
  112. client := &http.Client{}
  113. resp, err := client.Do(req)
  114. if err != nil {
  115. return nil, err
  116. }
  117. defer resp.Body.Close()
  118. // 读取响应
  119. respBody, err := io.ReadAll(resp.Body)
  120. if err != nil {
  121. return nil, err
  122. }
  123. if resp.StatusCode != http.StatusOK {
  124. return nil, errors.New(string(respBody))
  125. }
  126. return respBody, nil
  127. }
  128. /* rpc方式上传
  129. * @param address 域名,例如:192.168.3.206:8110
  130. * @param args 参数
  131. * @param args.BucketID 文件名
  132. * @param args.objectName 对象名称
  133. * @param args.Stream 文件流
  134. * @param args.Gzip 是否压缩
  135. * @return {"error_code":0,"error_msg":"上传成功"}
  136. * @return error 错误信息
  137. */
  138. func UpLoadByRpc(address string, args *entity.UploadArgs) (api.Result, error) {
  139. var reply api.Result
  140. err := rpcCall(address, "OSSService.Upload", args, &reply)
  141. return reply, err
  142. }
  143. /*
  144. *rpc方式下载
  145. * @param address 域名,例如:192.168.3.206:8110
  146. * @param args 参数
  147. * @param args.BucketID 文件名
  148. * @param args.objectName 对象名称
  149. * @return {"error_code":0,"error_msg":"下载成功","data":"文件流"}
  150. * @return error 错误信息
  151. */
  152. func DownloadByRpc(address string, args *entity.Args) (api.Result, error) {
  153. var reply api.Result
  154. err := rpcCall(address, "OSSService.Download", args, &reply)
  155. return reply, err
  156. }
  157. /* rpc方式删除
  158. * @param address 域名,例如:192.168.3.206:8110
  159. * @param args 参数
  160. * @param args.BucketID 文件名
  161. * @param args.objectName 对象名称
  162. * @return {"error_code":0,"error_msg":"删除成功"}
  163. * @return error 错误信息
  164. */
  165. func DeleteByRpc(address string, args *entity.Args) (api.Result, error) {
  166. var reply api.Result
  167. err := rpcCall(address, "OSSService.Delete", args, &reply)
  168. return reply, err
  169. }
  170. func rpcCall(address, serviceMethod string, args any, reply any) error {
  171. client, err := rpc.DialHTTP("tcp", address)
  172. if err != nil {
  173. log.Println(err)
  174. return err
  175. }
  176. defer client.Close()
  177. err = client.Call(serviceMethod, args, reply)
  178. if err != nil {
  179. log.Println(err)
  180. return err
  181. }
  182. return nil
  183. }