liuxiulin 2 vuotta sitten
commit
381ce9b470
4 muutettua tiedostoa jossa 200 lisäystä ja 0 poistoa
  1. 10 0
      .gitignore
  2. 148 0
      file_server.go
  3. 3 0
      go.mod
  4. 39 0
      request_file_test.go

+ 10 - 0
.gitignore

@@ -0,0 +1,10 @@
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+
+/server2
+/.idea

+ 148 - 0
file_server.go

@@ -0,0 +1,148 @@
+package filesdk
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"mime/multipart"
+	"net/http"
+	"strings"
+	"sync"
+)
+
+var (
+	persistent = "fs/api/v1/files/persistent" //文件持久化路径
+	upload     = "fs/api/v1/files"            // 文件上传api路径
+)
+
+type persistentStruct struct {
+	Hash string `json:"hash"`
+}
+
+type Config struct {
+	Host string
+}
+
+type ConfigHandle struct {
+	Host string
+}
+
+var (
+	once           sync.Once
+	internalHandle *ConfigHandle
+)
+
+func (c *Config) Init() {
+	//代码运行中需要的时候执行,且只执行一次
+	once.Do(func() {
+		internalHandle = &ConfigHandle{
+			Host: c.Host,
+		}
+	})
+}
+
+// GetHandle get handle
+func GetHandle() *ConfigHandle {
+	return internalHandle
+}
+
+//HandlePersistent 设置文件持久化
+func (c *ConfigHandle) HandlePersistent(hash string) error {
+	if hash == "" {
+		return errors.New("缺少请求参数")
+	}
+	param := persistentStruct{
+		Hash: hash,
+	}
+	s, err := json.Marshal(param)
+	if err != nil {
+		return err
+	}
+	url := fmt.Sprintf("%s/%s", c.Host, persistent)
+	reqBody := strings.NewReader(string(s))
+	req, err := http.NewRequest(http.MethodPut, url, reqBody)
+	if err != nil {
+		return err
+	}
+	req.Header.Set("Content-type", "application/json")
+	client := &http.Client{}
+	response, err := client.Do(req)
+	if err != nil {
+		return err
+	}
+	_, err = ioutil.ReadAll(response.Body)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+type FileInfo struct {
+	URL  string `json:"url"`
+	Name string `json:"name"`
+	Hash string `json:"hash"`
+	Size int64  `json:"size"`
+}
+
+// Upload 文件上传
+// headers 参数支持:FILE-EXPIRE,FILE-HASH
+func (c *ConfigHandle) Upload(fileName string, bucket string, headers map[string]string, fileData []byte) (*FileInfo, error) {
+	if len(fileData) == 0 {
+		return nil, errors.New("非法文件")
+	}
+	fileBytes := &bytes.Buffer{}
+	writer := multipart.NewWriter(fileBytes)
+	part, err := writer.CreateFormFile("fileData", fileName)
+	if err != nil {
+		return nil, err
+	}
+	if _, err = part.Write(fileData); err != nil {
+		return nil, err
+	}
+	baseUrlField, err := writer.CreateFormField("base_url")
+	if err != nil {
+		return nil, err
+	}
+	_, err = baseUrlField.Write([]byte(bucket))
+	if err != nil {
+		return nil, err
+	}
+	formKey, err := writer.CreateFormField("form_key")
+	if err != nil {
+		return nil, err
+	}
+	_, err = formKey.Write([]byte("fileData"))
+	if err != nil {
+		return nil, err
+	}
+
+	err = writer.Close()
+	if err != nil {
+		return nil, err
+	}
+	url := fmt.Sprintf("%s/%s", c.Host, upload)
+	req, err := http.NewRequest("POST", url, fileBytes)
+	if err != nil {
+		return nil, err
+	}
+	req.Header.Set("Content-type", writer.FormDataContentType())
+	for k, v := range headers {
+		req.Header.Set(k, v)
+	}
+	client := &http.Client{}
+	response, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	resp, err := ioutil.ReadAll(response.Body)
+	if err != nil {
+		return nil, err
+	}
+	var result *FileInfo
+	if err = json.Unmarshal(resp, &result); err != nil {
+		return nil, err
+	}
+	return result, nil
+}

+ 3 - 0
go.mod

@@ -0,0 +1,3 @@
+module filesdk
+
+go 1.16

+ 39 - 0
request_file_test.go

@@ -0,0 +1,39 @@
+package filesdk
+
+import (
+	"io/ioutil"
+	"os"
+	"testing"
+)
+
+func TestMain(m *testing.M) {
+	i := Config{
+		Host: "http://127.0.0.1:18199",
+	}
+	i.Init()
+	m.Run()
+}
+
+func Test_Persistent_file(t *testing.T) {
+	var hash = "sss"
+	if err := GetHandle().HandlePersistent(hash); err != nil {
+		t.Errorf("GetHandle().HandlePersistent() error %s", err)
+		return
+	}
+}
+
+func TestConfigHandle_Upload(t *testing.T) {
+	fileBytes, err := os.Open("logo.png")
+	if err != nil {
+		t.Fatal(err)
+	}
+	buf, err := ioutil.ReadAll(fileBytes)
+	if err != nil {
+		t.Fatal(err)
+	}
+	result, err := GetHandle().Upload("test.jpg", "testbucket", nil, buf)
+	if err != nil {
+		t.Fatal(err)
+	}
+	t.Log(result)
+}