client.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package ossClient
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "errors"
  7. "google.golang.org/grpc"
  8. "io"
  9. "log"
  10. "mime/multipart"
  11. "net/http"
  12. "net/rpc"
  13. "strconv"
  14. "sync"
  15. "time"
  16. "app.yhyue.com/moapp/jybase/api"
  17. "jygit.jydev.jianyu360.cn/BaseService/ossClient/constant"
  18. "jygit.jydev.jianyu360.cn/BaseService/ossClient/entity"
  19. "jygit.jydev.jianyu360.cn/BaseService/ossClient/pb"
  20. )
  21. var (
  22. GrpcCoon *grpc.ClientConn
  23. GrpcCoonOnce = &sync.Once{}
  24. )
  25. /* restful方式上传
  26. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  27. * @param bucketId 桶id
  28. * @param objectName 对象名称
  29. * @param stream 文件流
  30. * @param gzip 是否压缩
  31. * @return {"error_code":0,"error_msg":"上传成功"}
  32. */
  33. func UpLoadByRestful(domain, bucketId, objectName string, stream []byte, gzip bool) (reply *api.Result) {
  34. reply = &api.Result{Error_code: -1}
  35. // 创建一个缓冲区来存储表单数据
  36. body := &bytes.Buffer{}
  37. writer := multipart.NewWriter(body)
  38. writer.WriteField("bucket_id", bucketId)
  39. writer.WriteField("object_name", objectName)
  40. writer.WriteField("gzip", strconv.FormatBool(gzip))
  41. // 创建表单字段
  42. part, err := writer.CreateFormFile("file", objectName)
  43. if err != nil {
  44. reply.Error_msg = err.Error()
  45. return
  46. }
  47. // 模拟文件流
  48. fileStream := bytes.NewReader(stream)
  49. // 将文件流复制到表单字段
  50. _, err = io.Copy(part, fileStream)
  51. if err != nil {
  52. reply.Error_msg = err.Error()
  53. return
  54. }
  55. // 创建 HTTP 请求
  56. if respBody, err := Post(domain+constant.UploadUrl, writer, body); err != nil {
  57. reply.Error_msg = err.Error()
  58. } else {
  59. json.Unmarshal(respBody, &reply)
  60. }
  61. return
  62. }
  63. /* restful方式下载
  64. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  65. * @param bucketId 桶id
  66. * @param objectName 对象名称
  67. * @return {"error_code":0,"error_msg":"下载成功","data":文件流}
  68. */
  69. func DownloadByRestful(domain, bucketId, objectName string) (reply *api.Result) {
  70. reply = &api.Result{}
  71. // 创建一个缓冲区来存储表单数据
  72. body := &bytes.Buffer{}
  73. writer := multipart.NewWriter(body)
  74. writer.WriteField("bucket_id", bucketId)
  75. writer.WriteField("object_name", objectName)
  76. if respBody, err := Post(domain+constant.DownloadUrl, writer, body); err != nil {
  77. reply.Error_msg = err.Error()
  78. } else {
  79. reply.Error_msg = constant.DownloadSuccess
  80. reply.Data = respBody
  81. }
  82. return
  83. }
  84. /* restful方式删除
  85. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  86. * @param bucketId 桶id
  87. * @param objectName 对象名称
  88. * @return {"error_code":0,"error_msg":"删除成功"}
  89. */
  90. func DeleteByRestful(domain, bucketId, objectName string) (reply *api.Result) {
  91. reply = &api.Result{}
  92. // 创建一个缓冲区来存储表单数据
  93. body := &bytes.Buffer{}
  94. writer := multipart.NewWriter(body)
  95. writer.WriteField("bucket_id", bucketId)
  96. writer.WriteField("object_name", objectName)
  97. if respBody, err := Post(domain+constant.DeleteUrl, writer, body); err != nil {
  98. reply.Error_msg = err.Error()
  99. } else {
  100. json.Unmarshal(respBody, &reply)
  101. }
  102. return
  103. }
  104. /* restful方式获取标讯正文
  105. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  106. * @param bucketId 桶id
  107. * @param objectName 对象名称
  108. * @return {"error_code":0,"error_msg":"获取正文成功","data":"正文内容"}
  109. */
  110. func GetBidDetailByRestful(domain, bucketId, objectName string) (reply *api.Result) {
  111. reply = &api.Result{}
  112. // 创建一个缓冲区来存储表单数据
  113. body := &bytes.Buffer{}
  114. writer := multipart.NewWriter(body)
  115. writer.WriteField("bucket_id", bucketId)
  116. writer.WriteField("object_name", objectName)
  117. if respBody, err := Post(domain+constant.GetBidDetailUrl, writer, body); err != nil {
  118. reply.Error_msg = err.Error()
  119. } else {
  120. reply.Error_msg = constant.GetBidDetailSuccess
  121. reply.Data = string(respBody)
  122. }
  123. return
  124. }
  125. func Post(url string, writer *multipart.Writer, body *bytes.Buffer) ([]byte, error) {
  126. // 关闭表单写入器
  127. if err := writer.Close(); err != nil {
  128. return nil, err
  129. }
  130. // 创建 HTTP 请求
  131. req, err := http.NewRequest("POST", url, body)
  132. if err != nil {
  133. log.Println("Error creating request:", err)
  134. return nil, err
  135. }
  136. // 设置请求头
  137. req.Header.Set("Content-Type", writer.FormDataContentType())
  138. // 发送请求
  139. client := &http.Client{}
  140. resp, err := client.Do(req)
  141. if err != nil {
  142. return nil, err
  143. }
  144. defer resp.Body.Close()
  145. // 读取响应
  146. respBody, err := io.ReadAll(resp.Body)
  147. if err != nil {
  148. return nil, err
  149. }
  150. if resp.StatusCode != http.StatusOK {
  151. return nil, errors.New(string(respBody))
  152. }
  153. return respBody, nil
  154. }
  155. /* rpc方式上传
  156. * @param address 域名,例如:192.168.3.206:8110
  157. * @param args 参数
  158. * @param args.BucketID 文件名
  159. * @param args.objectName 对象名称
  160. * @param args.Stream 文件流
  161. * @param args.Gzip 是否压缩
  162. * @return {"error_code":0,"error_msg":"上传成功"}
  163. * @return error 错误信息
  164. */
  165. func UpLoadByRpc(address string, args *entity.UploadArgs) (*api.Result, error) {
  166. reply := &api.Result{}
  167. err := RpcCall(address, "OSSService.Upload", args, reply)
  168. return reply, err
  169. }
  170. /*
  171. *rpc方式下载
  172. * @param address 域名,例如:192.168.3.206:8110
  173. * @param args 参数
  174. * @param args.BucketID 文件名
  175. * @param args.objectName 对象名称
  176. * @return {"error_code":0,"error_msg":"下载成功","data":文件流}
  177. * @return error 错误信息
  178. */
  179. func DownloadByRpc(address string, args *entity.Args) (*api.Result, error) {
  180. reply := &api.Result{}
  181. err := RpcCall(address, "OSSService.Download", args, reply)
  182. return reply, err
  183. }
  184. /* rpc方式删除
  185. * @param address 域名,例如:192.168.3.206:8110
  186. * @param args 参数
  187. * @param args.BucketID 文件名
  188. * @param args.objectName 对象名称
  189. * @return {"error_code":0,"error_msg":"删除成功"}
  190. * @return error 错误信息
  191. */
  192. func DeleteByRpc(address string, args *entity.Args) (*api.Result, error) {
  193. reply := &api.Result{}
  194. err := RpcCall(address, "OSSService.Delete", args, reply)
  195. return reply, err
  196. }
  197. /*
  198. *rpc方式获取标讯正文
  199. * @param address 域名,例如:192.168.3.206:8110
  200. * @param args 参数
  201. * @param args.BucketID 文件名
  202. * @param args.objectName 对象名称
  203. * @return {"error_code":0,"error_msg":"获取成功","data":"正文内容"}
  204. * @return error 错误信息
  205. */
  206. func GetBidDetailByRpc(address string, args *entity.Args) (*api.Result, error) {
  207. reply := &api.Result{}
  208. err := RpcCall(address, "OSSService.GetBidDetail", args, reply)
  209. return reply, err
  210. }
  211. // rpc call
  212. func RpcCall(address, serviceMethod string, args any, reply any) error {
  213. conn, err := rpc.DialHTTP("tcp", address)
  214. if err != nil {
  215. log.Println(err)
  216. return err
  217. }
  218. err = conn.Call(serviceMethod, args, reply)
  219. if err != nil {
  220. log.Println(err)
  221. return err
  222. }
  223. return nil
  224. }
  225. // grpc call
  226. func GrpcCall(address string, args *entity.Args) (pb.ServiceClient, context.Context, error) {
  227. var err error
  228. GrpcCoonOnce.Do(func() {
  229. GrpcCoon, err = grpc.Dial(address, grpc.WithInsecure())
  230. })
  231. var ctx context.Context
  232. if args.Timeout == -1 {
  233. ctx = context.Background()
  234. } else {
  235. thisCtx, cancel := context.WithTimeout(context.TODO(), args.Timeout*time.Second)
  236. ctx = thisCtx
  237. defer cancel()
  238. }
  239. if err != nil {
  240. log.Println(err)
  241. return nil, ctx, err
  242. }
  243. return pb.NewServiceClient(GrpcCoon), ctx, nil
  244. }
  245. /*
  246. *grpc方式下载
  247. * @param address 域名,例如:192.168.3.206:8110
  248. * @param args 参数
  249. * @param args.BucketID 文件名
  250. * @param args.objectName 对象名称
  251. * @return []byte
  252. * @return error 错误信息
  253. */
  254. func DownloadByGrpc(address string, args *entity.Args) (*pb.Response, error) {
  255. serviceClient, ctx, err := GrpcCall(address, args)
  256. result := &pb.Response{}
  257. if err != nil {
  258. return result, err
  259. }
  260. resp, err := serviceClient.Download(ctx, &pb.Request{BucketID: args.BucketID, ObjectName: args.ObjectName})
  261. if err != nil {
  262. log.Println(err)
  263. return nil, err
  264. }
  265. b := &bytes.Buffer{}
  266. for {
  267. reply, err := resp.Recv()
  268. if err == io.EOF {
  269. break
  270. } else if err != nil {
  271. log.Println(err)
  272. return nil, err
  273. }
  274. result.ErrorMsg = reply.ErrorMsg
  275. result.ErrorCode = reply.ErrorCode
  276. b.Write(reply.Data)
  277. }
  278. result.Data = b.Bytes()
  279. return result, nil
  280. }
  281. /*
  282. *grpc方式获取标讯正文
  283. * @param address 域名,例如:192.168.3.206:8110
  284. * @param args 参数
  285. * @param args.BucketID 文件名
  286. * @param args.objectName 对象名称
  287. * @return {"error_code":0,"error_msg":"获取成功","data":"正文内容"}
  288. * @return error 错误信息
  289. */
  290. func GetBidDetailByGrpc(address string, args *entity.Args) (*api.Result, error) {
  291. result, err := DownloadByGrpc(address, args)
  292. if err != nil {
  293. return &api.Result{}, err
  294. }
  295. return &api.Result{
  296. Data: string(result.Data),
  297. Error_code: int(result.ErrorCode),
  298. Error_msg: result.ErrorMsg,
  299. }, nil
  300. }