oss.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. package oss
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "io"
  7. "log"
  8. "mime/multipart"
  9. "net/http"
  10. "net/rpc"
  11. )
  12. // Result 接口统一返回值
  13. type Result struct {
  14. Error_code int `json:"error_code"`
  15. Error_msg string `json:"error_msg"`
  16. Data interface{} `json:"data"`
  17. }
  18. func post(url string, writer *multipart.Writer, body *bytes.Buffer) ([]byte, error) {
  19. // 关闭表单写入器
  20. if err := writer.Close(); err != nil {
  21. return nil, err
  22. }
  23. // 创建 HTTP 请求
  24. req, err := http.NewRequest("POST", url, body)
  25. if err != nil {
  26. log.Println("post Error creating request:", err)
  27. return nil, err
  28. }
  29. // 设置请求头
  30. req.Header.Set("Content-Type", writer.FormDataContentType())
  31. // 发送请求
  32. client := &http.Client{}
  33. resp, err := client.Do(req)
  34. if err != nil {
  35. return nil, err
  36. }
  37. defer resp.Body.Close()
  38. // 读取响应
  39. respBody, err := io.ReadAll(resp.Body)
  40. if err != nil {
  41. return nil, err
  42. }
  43. if resp.StatusCode != http.StatusOK {
  44. return nil, errors.New(string(respBody))
  45. }
  46. return respBody, nil
  47. }
  48. /*
  49. restful请求地址:172.31.31.203:1111
  50. rpc请求地址:172.31.31.203:1111
  51. grpc请求地址:172.31.31.203:1112
  52. restful请求地址:172.17.162.27:18011
  53. rpc请求地址:172.17.162.27:18012
  54. grpc请求地址:172.17.162.27:18112
  55. oss代理服务使用:
  56. 客户端调用封装:https://jygit.jydev.jianyu360.cn/BaseService/ossClient/src/master/client.go
  57. 测试环境:
  58. 附件:
  59. BucketID:file
  60. ObjectName:xxxxxx
  61. 附件正文:
  62. BucketID:filetext
  63. ObjectName:xxxxxx.txt
  64. restful请求地址:172.31.31.203:1111
  65. rpc请求地址:172.31.31.203:1111
  66. grpc请求地址:172.31.31.203:1112
  67. 线上环境:
  68. 附件:
  69. BucketID:file
  70. ObjectName:xxxxxx
  71. 附件正文:
  72. BucketID:filetext
  73. ObjectName:xxxxxx.txt
  74. restful请求地址:172.17.162.27:18011
  75. rpc请求地址:172.17.162.27:18012
  76. grpc请求地址:172.17.162.27:18112
  77. */
  78. var Oss_Address_Test = "http://172.31.31.203:1111"
  79. var Oss_Address = "http://172.17.162.27:18011"
  80. var Detail_BucketId = "detail"
  81. var Html_BucketId = "contenthtml"
  82. var File_BucketId = "file"
  83. var FileText_BucketId = "filetext"
  84. // UploadArgs RPC相关结构体
  85. type UploadArgs struct {
  86. Stream []byte // 客户端将文件数据传递过来
  87. Gzip bool //是否压缩
  88. BucketID string //桶id
  89. ObjectName string //对象名称
  90. }
  91. type Args struct {
  92. BucketID string //桶id
  93. ObjectName string //对象名称
  94. }
  95. const (
  96. UploadUrl = "/ossservice/upload"
  97. DownloadUrl = "/ossservice/download"
  98. DeleteUrl = "/ossservice/delete"
  99. GetBidDetailUrl = "/ossservice/biddetail"
  100. UploadSuccess = "上传成功"
  101. DownloadSuccess = "下载成功"
  102. DeleteSuccess = "删除成功"
  103. GetBidDetailSuccess = "获取正文成功"
  104. UploadFail = "上传失败:%v"
  105. DownloadFail = "下载失败:%v"
  106. DeleteFail = "删除失败:%v"
  107. BidDetailFail = "获取正文失败:%v"
  108. )
  109. /* restful方式上传
  110. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  111. * @param bucketId 桶id
  112. * @param objectName 对象名称
  113. * @param stream 文件流
  114. * @param gzip 是否压缩
  115. * @return {"error_code":0,"error_msg":"上传成功"}
  116. */
  117. func UpLoadByRestful(domain, bucketId, objectName string, stream []byte, gzip bool) (reply *Result) {
  118. reply = &Result{Error_code: -1}
  119. // 创建一个缓冲区来存储表单数据
  120. body := &bytes.Buffer{}
  121. writer := multipart.NewWriter(body)
  122. writer.WriteField("bucket_id", bucketId)
  123. writer.WriteField("object_name", objectName)
  124. //writer.WriteField("gzip", strconv.FormatBool(gzip))
  125. // 创建表单字段
  126. part, err := writer.CreateFormFile("file", objectName)
  127. if err != nil {
  128. reply.Error_msg = err.Error()
  129. return
  130. }
  131. // 模拟文件流
  132. fileStream := bytes.NewReader(stream)
  133. // 将文件流复制到表单字段
  134. _, err = io.Copy(part, fileStream)
  135. if err != nil {
  136. reply.Error_msg = err.Error()
  137. return
  138. }
  139. // 创建 HTTP 请求
  140. if respBody, err := post(domain+UploadUrl, writer, body); err != nil {
  141. reply.Error_msg = err.Error()
  142. } else {
  143. json.Unmarshal(respBody, &reply)
  144. }
  145. return
  146. }
  147. /* restful方式下载
  148. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  149. * @param bucketId 桶id
  150. * @param objectName 对象名称
  151. * @return {"error_code":0,"error_msg":"下载成功"}
  152. */
  153. func DownloadByRestful(domain, bucketId, objectName string) (reply *Result) {
  154. reply = &Result{}
  155. // 创建一个缓冲区来存储表单数据
  156. body := &bytes.Buffer{}
  157. writer := multipart.NewWriter(body)
  158. writer.WriteField("bucket_id", bucketId)
  159. writer.WriteField("object_name", objectName)
  160. if respBody, err := post(domain+DownloadUrl, writer, body); err != nil {
  161. reply.Error_msg = err.Error()
  162. } else {
  163. reply.Error_msg = DownloadSuccess
  164. reply.Data = string(respBody)
  165. }
  166. return
  167. }
  168. /* restful方式删除
  169. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  170. * @param bucketId 桶id
  171. * @param objectName 对象名称
  172. * @return {"error_code":0,"error_msg":"上传成功"}
  173. */
  174. func DeleteByRestful(domain, bucketId, objectName string) (reply *Result) {
  175. reply = &Result{}
  176. // 创建一个缓冲区来存储表单数据
  177. body := &bytes.Buffer{}
  178. writer := multipart.NewWriter(body)
  179. writer.WriteField("bucket_id", bucketId)
  180. writer.WriteField("object_name", objectName)
  181. if respBody, err := post(domain+DeleteUrl, writer, body); err != nil {
  182. reply.Error_msg = err.Error()
  183. } else {
  184. json.Unmarshal(respBody, &reply)
  185. }
  186. return
  187. }
  188. /* restful方式获取标讯正文
  189. * @param domain 域名,例如:https://ossservice.jianyu360.cn
  190. * @param bucketId 桶id
  191. * @param objectName 对象名称
  192. * @return {"error_code":0,"error_msg":"获取正文成功","data":"正文内容"}
  193. */
  194. func GetBidDetailByRestful(domain, bucketId, objectName string) (reply *Result) {
  195. reply = &Result{}
  196. // 创建一个缓冲区来存储表单数据
  197. body := &bytes.Buffer{}
  198. writer := multipart.NewWriter(body)
  199. writer.WriteField("bucket_id", bucketId)
  200. writer.WriteField("object_name", objectName)
  201. if respBody, err := post(domain+GetBidDetailUrl, writer, body); err != nil {
  202. reply.Error_msg = err.Error()
  203. } else {
  204. reply.Error_msg = GetBidDetailSuccess
  205. reply.Data = string(respBody)
  206. }
  207. return
  208. }
  209. /* rpc方式上传
  210. * @param address 域名,例如:192.168.3.206:8110
  211. * @param args 参数
  212. * @param args.BucketID 文件名
  213. * @param args.objectName 对象名称
  214. * @param args.Stream 文件流
  215. * @param args.Gzip 是否压缩
  216. * @return {"error_code":0,"error_msg":"上传成功"}
  217. * @return error 错误信息
  218. */
  219. func UpLoadByRpc(address string, args *UploadArgs) (Result, error) {
  220. var reply Result
  221. err := rpcCall(address, "OSSService.Upload", args, &reply)
  222. return reply, err
  223. }
  224. /*
  225. *rpc方式下载
  226. * @param address 域名,例如:192.168.3.206:8110
  227. * @param args 参数
  228. * @param args.BucketID 文件名
  229. * @param args.objectName 对象名称
  230. * @return {"error_code":0,"error_msg":"下载成功","data":"文件流"}
  231. * @return error 错误信息
  232. */
  233. func DownloadByRpc(address string, args *Args) (Result, error) {
  234. var reply Result
  235. err := rpcCall(address, "OSSService.Download", args, &reply)
  236. return reply, err
  237. }
  238. /* rpc方式删除
  239. * @param address 域名,例如:192.168.3.206:8110
  240. * @param args 参数
  241. * @param args.BucketID 文件名
  242. * @param args.objectName 对象名称
  243. * @return {"error_code":0,"error_msg":"删除成功"}
  244. * @return error 错误信息
  245. */
  246. func DeleteByRpc(address string, args *Args) (Result, error) {
  247. var reply Result
  248. err := rpcCall(address, "OSSService.Delete", args, &reply)
  249. return reply, err
  250. }
  251. /*
  252. *rpc方式获取标讯正文
  253. * @param address 域名,例如:192.168.3.206:8110
  254. * @param args 参数
  255. * @param args.BucketID 文件名
  256. * @param args.objectName 对象名称
  257. * @return {"error_code":0,"error_msg":"下载成功","data":"正文内容"}
  258. * @return error 错误信息
  259. */
  260. func GetBidDetailByRpc(address string, args *Args) (Result, error) {
  261. var reply Result
  262. err := rpcCall(address, "OSSService.GetBidDetail", args, &reply)
  263. return reply, err
  264. }
  265. func rpcCall(address, serviceMethod string, args any, reply any) error {
  266. client, err := rpc.DialHTTP("tcp", address)
  267. if err != nil {
  268. log.Println("rpcCall", err)
  269. return err
  270. }
  271. defer client.Close()
  272. err = client.Call(serviceMethod, args, reply)
  273. if err != nil {
  274. log.Println("rpcCall", err)
  275. return err
  276. }
  277. return nil
  278. }