package service import ( "bytes" "context" "fmt" "mime/multipart" "time" "model-asynch/model/entity" commonHttp "gitea.com/red-future/common/http" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/guid" ) // 对接你们的 oss 文件服务:POST oss/file/uploadFile (multipart/form-data) type ossStorage struct{} type uploadFileResponse struct { FileURL string `json:"fileURL"` // 文件 URL FileSize int `json:"fileSize"` // 文件大小(字节) FileName string `json:"fileName"` // 文件名 FileFormat string `json:"fileFormat"` // 文件格式 FileAddressPrefix string `json:"fileAddressPrefix"` // 文件地址前缀 } func (s *ossStorage) UploadByTask(ctx context.Context, _ *entity.AsynchTask, data []byte, fileExt string, _ string) (ossURL string, err error) { // multipart body := &bytes.Buffer{} writer := multipart.NewWriter(body) ext := fileExt if ext == "" { ext = ".bin" } if ext[0] != '.' { ext = "." + ext } filename := fmt.Sprintf("asynch_%d_%s%s", time.Now().Unix(), guid.S(), ext) part, err := writer.CreateFormFile("file", filename) if err != nil { return "", err } if _, err := part.Write(data); err != nil { return "", err } contentType := writer.FormDataContentType() if err := writer.Close(); err != nil { return "", err } headers := forwardHeaders(ctx) headers["Content-Type"] = contentType fullURL := "oss/file/uploadFile" g.Log().Infof(ctx, "[OSS] upload start url=%s filename=%s size=%d", fullURL, filename, len(data)) var resp uploadFileResponse if err := commonHttp.Post(ctx, fullURL, headers, &resp, body.Bytes()); err != nil { return "", err } fmt.Println("打印结果 resp:", resp) g.Log().Infof(ctx, "[OSS] upload success url=%s size=%d format=%s", resp.FileURL, resp.FileSize, resp.FileFormat) return resp.FileURL, nil } // setTaskHeadersToCtx 把任务入库时保存的 header 信息注入 ctx,给 worker 调 OSS 用 func setTaskHeadersToCtx(ctx context.Context, headers map[string]string) context.Context { if headers == nil { return ctx } if v := gconv.String(headers["Authorization"]); v != "" { ctx = context.WithValue(ctx, "token", v) } if v := gconv.String(headers["X-User-Info"]); v != "" { ctx = context.WithValue(ctx, "xUserInfo", v) } return ctx }