123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- 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
- }
|