package storage import ( "context" "fmt" "strings" "time" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" ) type UploadInstruction struct { Method string `json:"method"` URL string `json:"url"` Headers map[string]string `json:"headers"` ExpiresAt time.Time `json:"expires_at"` } func (c *Client) PresignPut(ctx context.Context, objectKey, contentType string) (UploadInstruction, error) { if strings.TrimSpace(objectKey) == "" { return UploadInstruction{}, fmt.Errorf("对象键不能为空") } if strings.TrimSpace(contentType) == "" { return UploadInstruction{}, fmt.Errorf("内容类型不能为空") } result, err := c.client.Presign(ctx, &oss.PutObjectRequest{ Bucket: oss.Ptr(c.bucket), Key: oss.Ptr(objectKey), ContentType: oss.Ptr(contentType), ForbidOverwrite: oss.Ptr("true"), }, oss.PresignExpires(c.presignTTL)) if err != nil { return UploadInstruction{}, fmt.Errorf("生成上传预签名: %w", err) } return UploadInstruction{ Method: result.Method, URL: result.URL, Headers: result.SignedHeaders, ExpiresAt: result.Expiration, }, nil }