package fileLocal import ( "bytes" "encoding/json" "epur-pay/pkg/logger" "fmt" "io" "mime/multipart" "net/http" "reflect" "time" ) type Local struct { AccessKeyId string AccessKeySecret string BucketName string EndPoint string Access string RegionId string } type ReturnUpload struct { Code int64 `json:"code"` Message string `json:"message"` Data struct { FileUrl string `json:"fileUrl"` } `json:"data"` } func New(accessKeyId, accessKeySecret, bucketName, endPoint string, access string, regionId string) (*Local, error) { instance := &Local{ AccessKeyId: accessKeyId, AccessKeySecret: accessKeySecret, BucketName: bucketName, EndPoint: endPoint, Access: access, RegionId: regionId, } return instance, nil } func (this *Local) ReadUrl(filePath string) string { return this.url(filePath) } func (this *Local) url(fileName string) string { return fmt.Sprintf("http://%s/%s", this.Access, fileName) } func (this *Local) Put(fileName string, contentType string, data interface{}) string { var ossData io.Reader typeOf := reflect.TypeOf(data).Kind() switch typeOf { case reflect.Slice: ossData = bytes.NewBuffer(data.([]byte)) case reflect.Struct: ossData = data.(io.Reader) case reflect.Ptr: a1 := reflect.ValueOf(data).Interface() d := a1.([]uint8) ossData = bytes.NewBuffer(d) default: panic("数据不合法--!") } var buffer bytes.Buffer writer := multipart.NewWriter(&buffer) writer.WriteField("path", "test/file") // 创建一个新的表单文件字段,并将文件内容的io.Reader传递给它 fileField, err := writer.CreateFormFile("file", fileName) if err != nil { fmt.Println("创建表单文件字段时出错:", err) return "" } // 将文件内容的io.Reader复制到表单文件字段中 _, err = io.Copy(fileField, ossData) if err != nil { fmt.Println("复制文件内容时出错:", err) return "" } // 关闭multipart写入器以完成请求 writer.Close() request, err := http.NewRequest(http.MethodPost, fmt.Sprintf("http://%s", this.EndPoint), &buffer) if err != nil { logger.AccessLogger.Errorf("---> local upload request fail. %s", err.Error()) return "" } request.Header.Set("Content-Type", writer.FormDataContentType()) client := http.Client{Timeout: 5 * time.Second} response, errs := client.Do(request) if errs != nil { logger.AccessLogger.Errorf("---> local upload fail. %s", errs.Error()) return "" } if response.StatusCode == 200 { result := ReturnUpload{} bodyBuffer := new(bytes.Buffer) _, err = bodyBuffer.ReadFrom(response.Body) logger.AccessLogger.Errorf("----> %s", bodyBuffer.String()) if err != nil { logger.AccessLogger.Errorf("---> local upload fail. %s", errs.Error()) return "" } if err1 := json.Unmarshal([]byte(bodyBuffer.String()), &result); err1 != nil { panic(result.Message) } if result.Code == 200 { return result.Data.FileUrl } } defer response.Body.Close() return "" } // 获取直传token func (this *Local) Token(key string, contentType string) (map[string]interface{}, error) { token := make(map[string]interface{}) token["host"] = fmt.Sprintf("http://%s", this.EndPoint) token["directory"] = "pic" return token, nil }