file_server.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package filesdk
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io/ioutil"
  8. "mime/multipart"
  9. "net/http"
  10. "strings"
  11. "sync"
  12. )
  13. var (
  14. persistent = "fs/api/v1/files/persistent" //文件持久化路径
  15. upload = "fs/api/v1/files" // 文件上传api路径
  16. )
  17. type persistentStruct struct {
  18. Hash string `json:"hash"`
  19. }
  20. type Config struct {
  21. Host string
  22. }
  23. type ConfigHandle struct {
  24. Host string
  25. }
  26. var (
  27. once sync.Once
  28. internalHandle *ConfigHandle
  29. )
  30. func (c *Config) Init() {
  31. //代码运行中需要的时候执行,且只执行一次
  32. once.Do(func() {
  33. internalHandle = &ConfigHandle{
  34. Host: c.Host,
  35. }
  36. })
  37. }
  38. // GetHandle get handle
  39. func GetHandle() *ConfigHandle {
  40. return internalHandle
  41. }
  42. //HandlePersistent 设置文件持久化
  43. func (c *ConfigHandle) HandlePersistent(hash string) error {
  44. if hash == "" {
  45. return errors.New("缺少请求参数")
  46. }
  47. param := persistentStruct{
  48. Hash: hash,
  49. }
  50. s, err := json.Marshal(param)
  51. if err != nil {
  52. return err
  53. }
  54. url := fmt.Sprintf("%s/%s", c.Host, persistent)
  55. reqBody := strings.NewReader(string(s))
  56. req, err := http.NewRequest(http.MethodPut, url, reqBody)
  57. if err != nil {
  58. return err
  59. }
  60. req.Header.Set("Content-type", "application/json")
  61. client := &http.Client{}
  62. response, err := client.Do(req)
  63. if err != nil {
  64. return err
  65. }
  66. _, err = ioutil.ReadAll(response.Body)
  67. if err != nil {
  68. return err
  69. }
  70. return nil
  71. }
  72. type FileInfo struct {
  73. URL string `json:"url"`
  74. Name string `json:"name"`
  75. Hash string `json:"hash"`
  76. Size int64 `json:"size"`
  77. }
  78. // Upload 文件上传
  79. // headers 参数支持:FILE-EXPIRE,FILE-HASH
  80. func (c *ConfigHandle) Upload(fileName string, bucket string, headers map[string]string, fileData []byte) (*FileInfo, error) {
  81. if len(fileData) == 0 {
  82. return nil, errors.New("非法文件")
  83. }
  84. fileBytes := &bytes.Buffer{}
  85. writer := multipart.NewWriter(fileBytes)
  86. part, err := writer.CreateFormFile("fileData", fileName)
  87. if err != nil {
  88. return nil, err
  89. }
  90. if _, err = part.Write(fileData); err != nil {
  91. return nil, err
  92. }
  93. baseUrlField, err := writer.CreateFormField("base_url")
  94. if err != nil {
  95. return nil, err
  96. }
  97. _, err = baseUrlField.Write([]byte(bucket))
  98. if err != nil {
  99. return nil, err
  100. }
  101. formKey, err := writer.CreateFormField("form_key")
  102. if err != nil {
  103. return nil, err
  104. }
  105. _, err = formKey.Write([]byte("fileData"))
  106. if err != nil {
  107. return nil, err
  108. }
  109. err = writer.Close()
  110. if err != nil {
  111. return nil, err
  112. }
  113. url := fmt.Sprintf("%s/%s", c.Host, upload)
  114. req, err := http.NewRequest("POST", url, fileBytes)
  115. if err != nil {
  116. return nil, err
  117. }
  118. req.Header.Set("Content-type", writer.FormDataContentType())
  119. for k, v := range headers {
  120. req.Header.Set(k, v)
  121. }
  122. client := &http.Client{}
  123. response, err := client.Do(req)
  124. if err != nil {
  125. return nil, err
  126. }
  127. resp, err := ioutil.ReadAll(response.Body)
  128. if err != nil {
  129. return nil, err
  130. }
  131. var result *FileInfo
  132. if err = json.Unmarshal(resp, &result); err != nil {
  133. return nil, err
  134. }
  135. return result, nil
  136. }