// Copyright © 2023 OpenIM. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package obj import ( "context" "io" "net/http" "time" ) type BucketObject struct { Bucket string `json:"bucket"` Name string `json:"name"` } type ApplyPutArgs struct { Bucket string Name string Effective time.Duration // 申请有效时间 Header http.Header // header MaxObjectSize int64 } type HeaderOption struct { ContentType string Filename string } type ObjectInfo struct { Size int64 Hash string } type SizeReader interface { io.ReadCloser Size() int64 } func NewSizeReader(r io.ReadCloser, size int64) SizeReader { if r == nil { return nil } return &sizeReader{ size: size, ReadCloser: r, } } type sizeReader struct { size int64 io.ReadCloser } func (r *sizeReader) Size() int64 { return r.size } type Interface interface { // Name 存储名字 Name() string // MinFragmentSize 最小允许的分片大小 MinFragmentSize() int64 // MaxFragmentNum 最大允许的分片数量 MaxFragmentNum() int // MinExpirationTime 最小过期时间 MinExpirationTime() time.Duration // TempBucket 临时桶名,用于上传 TempBucket() string // DataBucket 永久存储的桶名 DataBucket() string // PresignedGetURL 通过桶名和对象名返回URL PresignedGetURL(ctx context.Context, bucket string, name string, expires time.Duration, opt *HeaderOption) (string, error) // PresignedPutURL 申请上传,返回PUT的上传地址 PresignedPutURL(ctx context.Context, args *ApplyPutArgs) (string, error) // GetObjectInfo 获取对象信息 GetObjectInfo(ctx context.Context, args *BucketObject) (*ObjectInfo, error) // CopyObject 复制对象 CopyObject(ctx context.Context, src *BucketObject, dst *BucketObject) error // DeleteObject 删除对象(不存在返回nil) DeleteObject(ctx context.Context, info *BucketObject) error // ComposeObject 合并对象 ComposeObject(ctx context.Context, src []BucketObject, dst *BucketObject) error // IsNotFound 判断是不是不存在导致的错误 IsNotFound(err error) bool // CheckName 检查名字是否可用 CheckName(name string) error // PutObject 上传文件 PutObject(ctx context.Context, info *BucketObject, reader io.Reader, size int64) (*ObjectInfo, error) // GetObject 下载文件 GetObject(ctx context.Context, info *BucketObject) (SizeReader, error) }