ossservice

package
v0.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 9, 2026 License: Apache-2.0 Imports: 16 Imported by: 0

Documentation

Overview

Package ossservice 提供 multipart 文件上传、限定 OSS 对象的 STS 凭据签发及 URL 内容摘要。 本包只依赖现有客户端,不创建或关闭连接,不读全局配置,不管理上传记录。 场景选择、身份检查、文件校验、ObjectKey 生成和 HTTP 响应由应用负责。 New(ossClient) 仅要求 OSS 客户端;需要签发凭据时通过 WithSTSClient 注入 STS 客户端。 未配置 STS 不影响服务构造,调用 CreateUploadCredentials 时返回 ErrSTSNotConfigured。

示例中的 ossClient、stsClient 为应用已创建的客户端,ctx 为请求 Context; 需导入 time 和 github.com/bpcoder16/pixiu/biz/ossservice:

service, err := ossservice.New(ossClient, ossservice.WithSTSClient(stsClient))
if err != nil {
    return err
}
result, err := service.CreateUploadCredentials(ctx, []string{
    "test/files/20261027/550e8400e29b41d4a716446655440000.json",
}, ossservice.UploadCredentialsOptions{
    RoleARN:     "acs:ram::123456789012:role/upload",
    SessionName: "file-upload",
    Duration:    40 * time.Minute,
})
if err != nil {
    return err
}
_ = result.Info
_ = result.Credentials

授权固定使用传入 OSS 客户端的 Bucket,仅包含指定 Key 的 oss:PutObject, 不授予读取、删除、列举权限;空列表、空 Key、含 *、? 或非法 UTF-8 的 Key 会在签发前被拒绝。 Policy 不对 Key 做路径清理或 URL 转义,授权范围与调用方提供的对象保持一致。 STS 仍限制完整 Policy 最多 2048 字节,超限直接失败,不改用通配符或拆分签发。 凭据有效期内允许再次写入同名对象;该流程不提供一次性上传或实际文件大小限制。

RoleARN、SessionName、Duration 透传 stsx 的校验和默认值; Credentials.Expiration 保留 time.Time,应用按接口约定转换时区及格式。 不缓存或重试签发,错误保留 SDK 错误链与 Context 取消、超时语义; SDK 错误可能包含敏感原文,勿直接记录错误、临时凭据或完整结果。 应用应先完成业务校验,签发成功并保存上传记录后再向客户端返回凭据; 保存失败时不返回凭据,已经签发的远端会话不会由本包回滚。

Multipart 文件上传

UploadMultipart 仅使用 OSS 客户端,无需配置 STS。示例中的 file 是已解析的 *multipart.FileHeader,应用在调用前完成场景、身份、文件规则校验和 Key 生成:

service, err := ossservice.New(ossClient)
if err != nil {
    return err
}
result, err := service.UploadMultipart(ctx, key, file)
if err != nil {
    return err
}
_ = result.RequestID

方法自行打开并关闭文件,以流的方式调用 ossx.PutObject,支持内存或落盘的表单文件。 不从文件名、文件头设置 ContentType,不读取整个文件到内存,不自动重试。 文件打开错误和 OSS 上传错误原样返回;文件关闭错误忽略,不改变上传结果。 共享 OSS 客户端继续由应用关闭。请求体大小限制、multipart 解析及临时文件删除 均属于 HTTP 调用方,须在参数绑定前登记 MultipartForm.RemoveAll 清理, 确保绑定失败或上传失败时仍可回收临时文件。 上传成功后再由应用保存记录;落库失败时本包不会自动删除已经上传的对象。

URL 内容 MD5

MD5FromURL 是独立包函数,无需创建 Service,也不要求 OSS 或 STS 客户端。 示例中的 ctx 带有调用方设置的总期限,fileURL 可为 CDN 地址或私有桶签名地址:

digest, err := ossservice.MD5FromURL(ctx, fileURL)
if err != nil {
    return err
}
_ = digest

使用 http.DefaultClient 发起 GET,保留其连接和重定向设置,不增加重试或固定超时。 仅对 HTTP 200 的完整正文流式计算 MD5,返回 32 位小写十六进制摘要;不解析内容或使用 ETag。 响应正文总会关闭,关闭错误不改变结果。HTTP 404 返回 ossx.ErrObjectNotFound, 其余状态、请求或读取失败可用 errors.Is(err, ErrFileRead) 判断;失败不返回部分摘要。 请求或读取正文时,调用方取消或到期优先保留其 Context 语义;HTTP 客户端超时也可用 errors.Is(err, context.DeadlineExceeded) 判断。返回的错误只保留稳定标记和适用的 HTTP 状态码, 不透传可能含签名 URL 或响应正文的底层错误。 本函数不查询上传记录、不签发 URL;调用方应让 URL 查询、签名和下载共享同一个 Context 总期限。

Index

Constants

This section is empty.

Variables

View Source
var ErrFileRead = errors.New("ossservice: read file failed")

ErrFileRead 表示 URL 请求、HTTP 状态或正文读取失败,错误中不包含 URL 或响应正文。 HTTP 404 单独返回 ossx.ErrObjectNotFound,取消和超时可通过 errors.Is 判断。

View Source
var ErrSTSNotConfigured = errors.New("ossservice: STS client is not configured")

ErrSTSNotConfigured 表示当前服务未配置签发上传凭据所需的 STS 客户端。

Functions

func MD5FromURL

func MD5FromURL(ctx context.Context, fileURL string) (string, error)

MD5FromURL 下载 URL 内容并返回 32 位小写十六进制 MD5,用于内容或版本比对。 无需创建 Service 或提供 OSS、STS 客户端;沿用 http.DefaultClient 的连接和重定向行为。 仅接受 HTTP 200,流式读取且关闭响应正文;调用方通过 ctx 控制总期限,本方法不另设超时。

Types

type Option

type Option func(*Service)

Option 在构造时配置服务的可选能力。

func WithSTSClient

func WithSTSClient(client *stsx.Client) Option

WithSTSClient 配置凭据签发使用的 STS 客户端;nil 与未配置等价。 客户端由调用方持有并关闭,仅 CreateUploadCredentials 要求提供该客户端。

type Service

type Service struct {
	// contains filtered or unexported fields
}

Service 借用 OSS 客户端组织上传流程,可通过 WithSTSClient 启用凭据签发,可并发使用。 客户端由调用方创建和关闭,服务不持有资源关闭责任。

func New

func New(ossClient *ossx.Client, options ...Option) (*Service, error)

New 创建服务,仅要求 OSS 客户端,不发起网络请求。 调用方须在所有调用结束后关闭传入的客户端。

func (*Service) CreateUploadCredentials

func (s *Service) CreateUploadCredentials(ctx context.Context, keys []string, options UploadCredentialsOptions) (UploadCredentialsResult, error)

CreateUploadCredentials 只授权 keys 中的精确对象执行 oss:PutObject。 未通过 WithSTSClient 配置 STS 时返回 ErrSTSNotConfigured。 keys 必须非空,每个 Key 必须是非空的有效 UTF-8 字符串且不含 *、?;完整 Policy 的 2048 字节限制由 stsx 校验。 不缓存、不重试、不写入数据库,失败返回零值并保留 STS 错误链和 Context 语义。

func (*Service) UploadMultipart

func (s *Service) UploadMultipart(ctx context.Context, key string, file *multipart.FileHeader) (ossx.PutObjectResult, error)

UploadMultipart 打开 multipart 文件并流式上传到指定 Key,仅依赖 OSS 客户端。 调用方负责文件校验和 Key 生成;不从文件名或文件头设置 ContentType。 方法返回前关闭自己打开的文件,MultipartForm.RemoveAll 仍由 HTTP 调用方执行。 上传结果及错误链沿用 ossx.PutObject,不重试,不关闭共享 OSS 客户端。

type UploadCredentialsOptions

type UploadCredentialsOptions struct {
	// RoleARN 为要扮演的 RAM 角色 ARN,必填。
	RoleARN string
	// SessionName 为角色会话名,留空沿用 stsx 的 sts-session 默认值。
	SessionName string
	// Duration 为 15 分钟至 12 小时的整秒时长,仍受角色最大会话时间限制。
	Duration time.Duration
}

UploadCredentialsOptions 指定上传凭据使用的角色与有效期。

type UploadCredentialsResult

type UploadCredentialsResult struct {
	// Info 为传入 OSS 客户端的非敏感连接信息,授权对象固定属于该 Bucket。
	Info ossx.Info
	// Credentials 为仅允许写入指定对象的临时凭据,禁止记录到日志。
	Credentials stsx.Credentials
}

UploadCredentialsResult 返回固定 Bucket 的连接信息和临时上传凭据。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL