This commit is contained in:
withchao 2023-03-15 11:24:59 +08:00
parent 316fa10257
commit e9865539de
7 changed files with 144 additions and 140 deletions

View File

@ -1,6 +1,7 @@
package third
import (
"OpenIM/pkg/common/tokenverify"
"OpenIM/pkg/proto/third"
"context"
"time"
@ -19,6 +20,11 @@ func (t *thirdServer) ConfirmPut(ctx context.Context, req *third.ConfirmPutReq)
}
func (t *thirdServer) GetUrl(ctx context.Context, req *third.GetUrlReq) (*third.GetUrlResp, error) {
if req.Expires <= 0 {
if err := tokenverify.CheckAdmin(ctx); err != nil {
return nil, err
}
}
return t.s3dataBase.GetUrl(ctx, req)
}

View File

@ -92,16 +92,13 @@ type config struct {
OssRoleArn string `yaml:"OssRoleArn"`
}
Minio struct {
Bucket string `yaml:"bucket"`
AppBucket string `yaml:"appBucket"`
Location string `yaml:"location"`
Endpoint string `yaml:"endpoint"`
AccessKeyID string `yaml:"accessKeyID"`
SecretAccessKey string `yaml:"secretAccessKey"`
EndpointInner string `yaml:"endpointInner"`
EndpointInnerEnable bool `yaml:"endpointInnerEnable"`
StorageTime int `yaml:"storageTime"`
IsDistributedMod bool `yaml:"isDistributedMod"`
TempBucket string `yaml:"tempBucket"`
DataBucket string `yaml:"dataBucket"`
Location string `yaml:"location"`
Endpoint string `yaml:"endpoint"`
AccessKeyID string `yaml:"accessKeyID"`
SecretAccessKey string `yaml:"secretAccessKey"`
IsDistributedMod bool `yaml:"isDistributedMod"`
} `yaml:"minio"`
Aws struct {
AccessKeyID string `yaml:"accessKeyID"`

View File

@ -20,6 +20,12 @@ import (
"time"
)
const (
hashPrefix = "hash"
tempPrefix = "temp"
fragmentPrefix = "fragment_"
)
type S3Database interface {
ApplyPut(ctx context.Context, req *third.ApplyPutReq) (*third.ApplyPutResp, error)
GetPut(ctx context.Context, req *third.GetPutReq) (*third.GetPutResp, error)
@ -51,7 +57,7 @@ func (c *s3Database) today() string {
// fragmentName 根据序号生成文件名
func (c *s3Database) fragmentName(index int) string {
return "fragment_" + strconv.Itoa(index+1)
return fragmentPrefix + strconv.Itoa(index+1)
}
// getFragmentNum 获取分片大小和分片数量
@ -79,17 +85,12 @@ func (c *s3Database) CheckHash(hash string) error {
return err
}
if len(val) != md5.Size {
return errors.New("hash value error")
return errs.ErrArgs.Wrap("invalid hash")
}
return nil
}
func (c *s3Database) urlName(name string) string {
//if name[0] != '/' {
// name = "/" + name
//}
//config.Config.Credential.ObjectURL + name
//return "http://127.0.0.1:8080" + name
return config.Config.Object.ApiURL + name
}
@ -98,7 +99,7 @@ func (c *s3Database) UUID() string {
}
func (c *s3Database) HashName(hash string) string {
return path.Join("hash", c.today(), c.UUID())
return path.Join(hashPrefix, hash+"_"+c.today()+"_"+c.UUID())
}
func (c *s3Database) isNotFound(err error) bool {
@ -146,7 +147,7 @@ func (c *s3Database) ApplyPut(ctx context.Context, req *third.ApplyPutReq) (*thi
ExpirationTime: expirationTime,
EffectiveTime: time.Now().Add(effective),
}
put.Path = path.Join("upload", c.today(), req.Hash, put.PutID)
put.Path = path.Join(tempPrefix, c.today(), req.Hash, put.PutID)
putURLs := make([]string, 0, pack)
for i := 0; i < pack; i++ {
url, err := c.obj.PresignedPutURL(ctx, &obj.ApplyPutArgs{
@ -373,8 +374,12 @@ func (c *s3Database) GetUrl(ctx context.Context, req *third.GetUrlReq) (*third.G
if err != nil {
return nil, err
}
u, err := c.obj.GetURL(ctx, hash.Bucket, hash.Name, time.Duration(req.Expires)*time.Millisecond)
if err != nil {
return nil, err
}
return &third.GetUrlResp{
Url: c.obj.GetURL(hash.Bucket, hash.Name),
Url: u,
Size: hash.Size,
Hash: hash.Hash,
}, nil

View File

@ -2,25 +2,18 @@ package obj
import (
"OpenIM/pkg/common/config"
"OpenIM/pkg/utils"
"context"
"errors"
"fmt"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
"github.com/minio/minio-go/v7/pkg/s3utils"
"net/http"
"net/url"
"time"
)
func NewMinioClient() {
}
func NewMinioInterface() (Interface, error) {
if true {
return &minioImpl{}, nil // todo
}
conf := config.Config.Object.Minio
u, err := url.Parse(conf.Endpoint)
if err != nil {
@ -31,42 +24,43 @@ func NewMinioInterface() (Interface, error) {
}
client, err := minio.New(u.Host, &minio.Options{
Creds: credentials.NewStaticV4(conf.AccessKeyID, conf.SecretAccessKey, ""),
Secure: false,
Secure: u.Scheme == "https",
})
if err != nil {
return nil, fmt.Errorf("minio new client %w", err)
}
// todo 初始化连接和桶
ctx, cancel := context.WithTimeout(context.Background(), time.Second*20)
defer cancel()
for _, bucket := range utils.Distinct([]string{conf.TempBucket, conf.DataBucket}) {
exists, err := client.BucketExists(ctx, bucket)
if err != nil {
return nil, fmt.Errorf("minio bucket %s exists %w", bucket, err)
}
if exists {
continue
}
opt := minio.MakeBucketOptions{
Region: conf.Location,
ObjectLocking: conf.IsDistributedMod,
}
if err := client.MakeBucket(ctx, conf.TempBucket, opt); err != nil {
return nil, fmt.Errorf("minio make bucket %s %w", bucket, err)
}
}
return &minioImpl{
client: client,
//tempBucket: conf.Bucket,
client: client,
tempBucket: conf.TempBucket,
dataBucket: conf.DataBucket,
}, nil
}
type minioImpl struct {
tempBucket string // 上传桶
permanentBucket string // 永久桶
clearBucket string // 自动清理桶
urlstr string // 访问地址
client *minio.Client
tempBucket string // 上传桶
dataBucket string // 永久桶
urlstr string // 访问地址
client *minio.Client
}
//func (m *minioImpl) Init() error {
// client, err := minio.New("127.0.0.1:9000", &minio.Options{
// Creds: credentials.NewStaticV4("minioadmin", "minioadmin", ""),
// Secure: false,
// })
// if err != nil {
// return fmt.Errorf("minio client error: %w", err)
// }
// m.urlstr = "http://127.0.0.1:9000"
// m.client = client
// m.tempBucket = "temp"
// m.permanentBucket = "permanent"
// m.clearBucket = "clear"
// return nil
//}
func (m *minioImpl) Name() string {
return "minio"
}
@ -83,26 +77,20 @@ func (m *minioImpl) MinExpirationTime() time.Duration {
return time.Hour * 24
}
func (m *minioImpl) AppendHeader() http.Header {
return map[string][]string{
"x-amz-object-append": {"true"},
}
}
func (m *minioImpl) TempBucket() string {
return m.tempBucket
}
func (m *minioImpl) DataBucket() string {
return m.permanentBucket
return m.dataBucket
}
func (m *minioImpl) ClearBucket() string {
return m.clearBucket
}
func (m *minioImpl) GetURL(bucket string, name string) string {
return fmt.Sprintf("%s/%s/%s", m.urlstr, bucket, name)
func (m *minioImpl) GetURL(ctx context.Context, bucket string, name string, expires time.Duration) (string, error) {
u, err := m.client.PresignedGetObject(ctx, bucket, name, expires, nil)
if err != nil {
return "", err
}
return u.String(), nil
}
func (m *minioImpl) PresignedPutURL(ctx context.Context, args *ApplyPutArgs) (string, error) {
@ -131,7 +119,6 @@ func (m *minioImpl) GetObjectInfo(ctx context.Context, args *BucketObject) (*Obj
return nil, err
}
return &ObjectInfo{
URL: m.GetURL(args.Bucket, args.Name),
Size: info.Size,
Hash: info.ETag,
}, nil

View File

@ -20,10 +20,8 @@ type ApplyPutArgs struct {
}
type ObjectInfo struct {
URL string
Size int64
Hash string
Expiration time.Time
Size int64
Hash string
}
type Interface interface {
@ -40,7 +38,8 @@ type Interface interface {
// DataBucket 永久存储的桶名
DataBucket() string
// GetURL 通过桶名和对象名返回URL
GetURL(bucket string, name string) string
//GetURL(bucket string, name string) string
GetURL(ctx context.Context, bucket string, name string, expires time.Duration) (string, error)
// PresignedPutURL 申请上传,返回PUT的上传地址
PresignedPutURL(ctx context.Context, args *ApplyPutArgs) (string, error)
// GetObjectInfo 获取对象信息

View File

@ -39,7 +39,7 @@ func (m *ApplyPutReq) Reset() { *m = ApplyPutReq{} }
func (m *ApplyPutReq) String() string { return proto.CompactTextString(m) }
func (*ApplyPutReq) ProtoMessage() {}
func (*ApplyPutReq) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{0}
return fileDescriptor_third_aac767b0c26bb83e, []int{0}
}
func (m *ApplyPutReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ApplyPutReq.Unmarshal(m, b)
@ -109,7 +109,7 @@ func (m *ApplyPutResp) Reset() { *m = ApplyPutResp{} }
func (m *ApplyPutResp) String() string { return proto.CompactTextString(m) }
func (*ApplyPutResp) ProtoMessage() {}
func (*ApplyPutResp) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{1}
return fileDescriptor_third_aac767b0c26bb83e, []int{1}
}
func (m *ApplyPutResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ApplyPutResp.Unmarshal(m, b)
@ -168,7 +168,7 @@ func (m *ConfirmPutReq) Reset() { *m = ConfirmPutReq{} }
func (m *ConfirmPutReq) String() string { return proto.CompactTextString(m) }
func (*ConfirmPutReq) ProtoMessage() {}
func (*ConfirmPutReq) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{2}
return fileDescriptor_third_aac767b0c26bb83e, []int{2}
}
func (m *ConfirmPutReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConfirmPutReq.Unmarshal(m, b)
@ -206,7 +206,7 @@ func (m *ConfirmPutResp) Reset() { *m = ConfirmPutResp{} }
func (m *ConfirmPutResp) String() string { return proto.CompactTextString(m) }
func (*ConfirmPutResp) ProtoMessage() {}
func (*ConfirmPutResp) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{3}
return fileDescriptor_third_aac767b0c26bb83e, []int{3}
}
func (m *ConfirmPutResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConfirmPutResp.Unmarshal(m, b)
@ -235,6 +235,7 @@ func (m *ConfirmPutResp) GetUrl() string {
type GetUrlReq struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
Expires int64 `protobuf:"varint,2,opt,name=expires" json:"expires,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -244,7 +245,7 @@ func (m *GetUrlReq) Reset() { *m = GetUrlReq{} }
func (m *GetUrlReq) String() string { return proto.CompactTextString(m) }
func (*GetUrlReq) ProtoMessage() {}
func (*GetUrlReq) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{4}
return fileDescriptor_third_aac767b0c26bb83e, []int{4}
}
func (m *GetUrlReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetUrlReq.Unmarshal(m, b)
@ -271,6 +272,13 @@ func (m *GetUrlReq) GetName() string {
return ""
}
func (m *GetUrlReq) GetExpires() int64 {
if m != nil {
return m.Expires
}
return 0
}
type GetUrlResp struct {
Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"`
Size int64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"`
@ -284,7 +292,7 @@ func (m *GetUrlResp) Reset() { *m = GetUrlResp{} }
func (m *GetUrlResp) String() string { return proto.CompactTextString(m) }
func (*GetUrlResp) ProtoMessage() {}
func (*GetUrlResp) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{5}
return fileDescriptor_third_aac767b0c26bb83e, []int{5}
}
func (m *GetUrlResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetUrlResp.Unmarshal(m, b)
@ -336,7 +344,7 @@ func (m *GetPutReq) Reset() { *m = GetPutReq{} }
func (m *GetPutReq) String() string { return proto.CompactTextString(m) }
func (*GetPutReq) ProtoMessage() {}
func (*GetPutReq) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{6}
return fileDescriptor_third_aac767b0c26bb83e, []int{6}
}
func (m *GetPutReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetPutReq.Unmarshal(m, b)
@ -375,7 +383,7 @@ func (m *GetPutFragment) Reset() { *m = GetPutFragment{} }
func (m *GetPutFragment) String() string { return proto.CompactTextString(m) }
func (*GetPutFragment) ProtoMessage() {}
func (*GetPutFragment) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{7}
return fileDescriptor_third_aac767b0c26bb83e, []int{7}
}
func (m *GetPutFragment) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetPutFragment.Unmarshal(m, b)
@ -425,7 +433,7 @@ func (m *GetPutResp) Reset() { *m = GetPutResp{} }
func (m *GetPutResp) String() string { return proto.CompactTextString(m) }
func (*GetPutResp) ProtoMessage() {}
func (*GetPutResp) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{8}
return fileDescriptor_third_aac767b0c26bb83e, []int{8}
}
func (m *GetPutResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetPutResp.Unmarshal(m, b)
@ -498,7 +506,7 @@ func (m *GetSignalInvitationInfoReq) Reset() { *m = GetSignalInvitationI
func (m *GetSignalInvitationInfoReq) String() string { return proto.CompactTextString(m) }
func (*GetSignalInvitationInfoReq) ProtoMessage() {}
func (*GetSignalInvitationInfoReq) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{9}
return fileDescriptor_third_aac767b0c26bb83e, []int{9}
}
func (m *GetSignalInvitationInfoReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSignalInvitationInfoReq.Unmarshal(m, b)
@ -537,7 +545,7 @@ func (m *GetSignalInvitationInfoResp) Reset() { *m = GetSignalInvitation
func (m *GetSignalInvitationInfoResp) String() string { return proto.CompactTextString(m) }
func (*GetSignalInvitationInfoResp) ProtoMessage() {}
func (*GetSignalInvitationInfoResp) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{10}
return fileDescriptor_third_aac767b0c26bb83e, []int{10}
}
func (m *GetSignalInvitationInfoResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSignalInvitationInfoResp.Unmarshal(m, b)
@ -582,7 +590,7 @@ func (m *GetSignalInvitationInfoStartAppReq) Reset() { *m = GetSignalInv
func (m *GetSignalInvitationInfoStartAppReq) String() string { return proto.CompactTextString(m) }
func (*GetSignalInvitationInfoStartAppReq) ProtoMessage() {}
func (*GetSignalInvitationInfoStartAppReq) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{11}
return fileDescriptor_third_aac767b0c26bb83e, []int{11}
}
func (m *GetSignalInvitationInfoStartAppReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSignalInvitationInfoStartAppReq.Unmarshal(m, b)
@ -621,7 +629,7 @@ func (m *GetSignalInvitationInfoStartAppResp) Reset() { *m = GetSignalIn
func (m *GetSignalInvitationInfoStartAppResp) String() string { return proto.CompactTextString(m) }
func (*GetSignalInvitationInfoStartAppResp) ProtoMessage() {}
func (*GetSignalInvitationInfoStartAppResp) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{12}
return fileDescriptor_third_aac767b0c26bb83e, []int{12}
}
func (m *GetSignalInvitationInfoStartAppResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSignalInvitationInfoStartAppResp.Unmarshal(m, b)
@ -669,7 +677,7 @@ func (m *FcmUpdateTokenReq) Reset() { *m = FcmUpdateTokenReq{} }
func (m *FcmUpdateTokenReq) String() string { return proto.CompactTextString(m) }
func (*FcmUpdateTokenReq) ProtoMessage() {}
func (*FcmUpdateTokenReq) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{13}
return fileDescriptor_third_aac767b0c26bb83e, []int{13}
}
func (m *FcmUpdateTokenReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FcmUpdateTokenReq.Unmarshal(m, b)
@ -727,7 +735,7 @@ func (m *FcmUpdateTokenResp) Reset() { *m = FcmUpdateTokenResp{} }
func (m *FcmUpdateTokenResp) String() string { return proto.CompactTextString(m) }
func (*FcmUpdateTokenResp) ProtoMessage() {}
func (*FcmUpdateTokenResp) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{14}
return fileDescriptor_third_aac767b0c26bb83e, []int{14}
}
func (m *FcmUpdateTokenResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FcmUpdateTokenResp.Unmarshal(m, b)
@ -759,7 +767,7 @@ func (m *SetAppBadgeReq) Reset() { *m = SetAppBadgeReq{} }
func (m *SetAppBadgeReq) String() string { return proto.CompactTextString(m) }
func (*SetAppBadgeReq) ProtoMessage() {}
func (*SetAppBadgeReq) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{15}
return fileDescriptor_third_aac767b0c26bb83e, []int{15}
}
func (m *SetAppBadgeReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetAppBadgeReq.Unmarshal(m, b)
@ -803,7 +811,7 @@ func (m *SetAppBadgeResp) Reset() { *m = SetAppBadgeResp{} }
func (m *SetAppBadgeResp) String() string { return proto.CompactTextString(m) }
func (*SetAppBadgeResp) ProtoMessage() {}
func (*SetAppBadgeResp) Descriptor() ([]byte, []int) {
return fileDescriptor_third_85db3e967ff9b8c1, []int{16}
return fileDescriptor_third_aac767b0c26bb83e, []int{16}
}
func (m *SetAppBadgeResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetAppBadgeResp.Unmarshal(m, b)
@ -1146,55 +1154,56 @@ var _Third_serviceDesc = grpc.ServiceDesc{
Metadata: "third/third.proto",
}
func init() { proto.RegisterFile("third/third.proto", fileDescriptor_third_85db3e967ff9b8c1) }
func init() { proto.RegisterFile("third/third.proto", fileDescriptor_third_aac767b0c26bb83e) }
var fileDescriptor_third_85db3e967ff9b8c1 = []byte{
// 746 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xc1, 0x6e, 0xda, 0x4a,
0x14, 0x95, 0x21, 0xf0, 0xc2, 0x25, 0x8f, 0xbc, 0x8c, 0xa2, 0xf7, 0x90, 0x5f, 0x9a, 0x90, 0x89,
0x92, 0xb2, 0x09, 0x48, 0xa9, 0xd4, 0x56, 0x6a, 0x55, 0x35, 0x49, 0x45, 0x44, 0x55, 0x14, 0x64,
0x42, 0x17, 0xdd, 0x54, 0x2e, 0x0c, 0x60, 0xc5, 0x8c, 0xa7, 0x33, 0xe3, 0xa4, 0xcd, 0x0f, 0x54,
0x55, 0x77, 0xfd, 0x9a, 0x2e, 0xfb, 0x01, 0xfd, 0xa8, 0xca, 0x63, 0x1b, 0x6c, 0xb0, 0x21, 0xe9,
0xa6, 0xdd, 0x58, 0x33, 0xc7, 0xe7, 0x9e, 0x39, 0x73, 0x7d, 0xef, 0x05, 0xd8, 0x90, 0x23, 0x8b,
0xf7, 0xeb, 0xea, 0x59, 0x63, 0xdc, 0x91, 0x0e, 0x42, 0xe7, 0x8c, 0xd0, 0x66, 0xab, 0x43, 0xf8,
0x15, 0xe1, 0x35, 0xf5, 0x46, 0xbf, 0xef, 0x61, 0x87, 0xcd, 0xd6, 0xa1, 0x8f, 0xd6, 0xd9, 0xe5,
0xb0, 0xae, 0xd8, 0x75, 0xd1, 0xbf, 0xbc, 0x16, 0xf5, 0x6b, 0xe1, 0x07, 0xe3, 0x2f, 0x1a, 0x14,
0x8f, 0x19, 0xb3, 0x3f, 0xb6, 0x5d, 0x69, 0x90, 0xf7, 0x08, 0xc1, 0x0a, 0x35, 0xc7, 0xa4, 0xac,
0x55, 0xb4, 0x6a, 0xc1, 0x50, 0x6b, 0x0f, 0x13, 0xd6, 0x0d, 0x29, 0x67, 0x2a, 0x5a, 0x35, 0x6b,
0xa8, 0xb5, 0x87, 0x8d, 0x4c, 0x31, 0x2a, 0x67, 0x7d, 0x9e, 0xb7, 0x46, 0x18, 0xd6, 0x06, 0xdc,
0x1c, 0x8e, 0x09, 0x95, 0x1d, 0x8f, 0xbf, 0xa2, 0xf8, 0x31, 0x0c, 0x6d, 0x41, 0xa1, 0x67, 0x13,
0x93, 0x5e, 0x58, 0x63, 0x52, 0xce, 0x29, 0xc2, 0x14, 0xc0, 0x12, 0xd6, 0xa6, 0x66, 0x04, 0x43,
0xff, 0x40, 0xd6, 0xe5, 0x76, 0x60, 0xc6, 0x5b, 0xa2, 0x4d, 0xc8, 0x31, 0x57, 0x36, 0x5f, 0x28,
0x33, 0x05, 0xc3, 0xdf, 0xcc, 0x9d, 0x9c, 0x4d, 0x38, 0xb9, 0x0c, 0x7f, 0xb5, 0x5d, 0xd9, 0x35,
0x5e, 0x89, 0x72, 0xae, 0x92, 0xad, 0x16, 0x8c, 0x70, 0x8b, 0xf7, 0xe1, 0xef, 0x53, 0x87, 0x0e,
0x2c, 0x3e, 0x0e, 0x92, 0x30, 0x39, 0x44, 0x8b, 0x1c, 0x82, 0x31, 0x94, 0xa2, 0xb4, 0x24, 0x7b,
0x78, 0x07, 0x0a, 0x67, 0x44, 0x76, 0xb9, 0x9d, 0x92, 0x4b, 0xdc, 0x00, 0x08, 0x09, 0x89, 0xf7,
0xbb, 0x65, 0xae, 0xf1, 0xae, 0x3a, 0x68, 0xa1, 0xdf, 0xc7, 0x50, 0xf2, 0x29, 0x8d, 0x20, 0x0d,
0x13, 0x71, 0x2d, 0x41, 0x3c, 0x13, 0x11, 0xff, 0xa1, 0x29, 0x97, 0xe1, 0x35, 0x7f, 0x6b, 0x4d,
0xa0, 0xe7, 0x50, 0x08, 0xd9, 0xa2, 0x9c, 0xaf, 0x64, 0xab, 0xc5, 0x23, 0x5c, 0x9b, 0x2f, 0xf9,
0x5a, 0xfc, 0xae, 0xc6, 0x34, 0x08, 0x3f, 0x03, 0xfd, 0x8c, 0xc8, 0x8e, 0x35, 0xa4, 0xa6, 0xdd,
0xa4, 0x57, 0x96, 0x34, 0xa5, 0xe5, 0xd0, 0x26, 0x1d, 0x38, 0x5e, 0xf2, 0x2a, 0x50, 0x3c, 0xb5,
0x2d, 0x42, 0x65, 0x4b, 0x0c, 0x27, 0x29, 0x8c, 0x42, 0xf8, 0x9b, 0x06, 0xff, 0xa7, 0x0a, 0x08,
0x86, 0x5e, 0x42, 0xc9, 0x8a, 0xa1, 0x4a, 0x64, 0xce, 0xa6, 0xea, 0xbc, 0xda, 0x4c, 0xfc, 0x4c,
0x24, 0x6a, 0xc1, 0xba, 0x33, 0x18, 0xd8, 0x16, 0x25, 0x6d, 0x57, 0x8c, 0x94, 0x58, 0x46, 0x89,
0xed, 0x25, 0x89, 0x9d, 0xc7, 0xa9, 0xc6, 0x6c, 0x2c, 0x7e, 0x0a, 0x38, 0xc5, 0x79, 0x47, 0x9a,
0x5c, 0x1e, 0x33, 0xe6, 0xa5, 0xe0, 0x5f, 0xc8, 0xbb, 0x82, 0xf0, 0xc9, 0xed, 0x83, 0x1d, 0xfe,
0xae, 0xc1, 0xde, 0xd2, 0xf0, 0x3f, 0x3b, 0x01, 0x9f, 0x35, 0xd8, 0x68, 0xf4, 0xc6, 0x5d, 0xd6,
0x37, 0x25, 0xb9, 0x70, 0x2e, 0x09, 0xf5, 0x2e, 0xbc, 0x0d, 0xd0, 0xb6, 0x4d, 0x39, 0x70, 0xf8,
0x38, 0xb8, 0x74, 0xce, 0x88, 0x20, 0x48, 0x87, 0xd5, 0x46, 0x6f, 0xac, 0xe8, 0x41, 0x63, 0x4c,
0xf6, 0xde, 0x1c, 0x31, 0x7b, 0x3d, 0xc7, 0xa5, 0x32, 0x28, 0xf4, 0x70, 0xeb, 0xa9, 0x92, 0x0f,
0xcc, 0xe2, 0x44, 0x15, 0xb2, 0x5f, 0xe9, 0x11, 0x04, 0x6f, 0x02, 0x9a, 0xb5, 0x22, 0x18, 0x6e,
0x43, 0xa9, 0x43, 0xbc, 0x54, 0x9e, 0x98, 0xfd, 0x21, 0x59, 0xf0, 0x39, 0xd0, 0x01, 0x94, 0x8e,
0x19, 0xeb, 0x52, 0x4e, 0xcc, 0xfe, 0xa9, 0x32, 0x90, 0x51, 0xce, 0x67, 0x50, 0xbc, 0x01, 0xeb,
0x31, 0x45, 0xc1, 0x8e, 0x3e, 0xe5, 0x21, 0xa7, 0xda, 0x04, 0xb5, 0x60, 0x35, 0x1c, 0xb1, 0x68,
0x27, 0xa9, 0x8f, 0x22, 0xbf, 0x06, 0x7a, 0x65, 0x31, 0x41, 0x30, 0x74, 0x06, 0x79, 0xbf, 0xf1,
0xd0, 0xbd, 0xf4, 0xa6, 0xf4, 0xa4, 0xb6, 0x17, 0xbd, 0x16, 0x0c, 0x75, 0x00, 0xa6, 0xd3, 0x15,
0xed, 0x26, 0xb1, 0x63, 0x43, 0x5a, 0xc7, 0xcb, 0x28, 0x13, 0x77, 0x5d, 0x6e, 0xa7, 0xba, 0xf3,
0x47, 0x75, 0xaa, 0xbb, 0x70, 0x50, 0xdf, 0xc0, 0x7f, 0x29, 0x8d, 0x80, 0x6a, 0x29, 0xa1, 0x29,
0xf3, 0x46, 0xaf, 0xdf, 0x89, 0x2f, 0x18, 0xfa, 0xaa, 0xc1, 0xce, 0x92, 0x2e, 0x44, 0x0f, 0xef,
0x20, 0x1a, 0xe9, 0x7c, 0xfd, 0xd1, 0x2f, 0xc5, 0x09, 0x86, 0xde, 0x42, 0x29, 0x5e, 0xcb, 0x68,
0x3f, 0x49, 0x6a, 0xae, 0xf5, 0xf4, 0x83, 0xdb, 0xd0, 0x04, 0x43, 0xaf, 0xa1, 0x18, 0x29, 0x62,
0x94, 0xf8, 0xb5, 0xe3, 0x7d, 0xa3, 0xef, 0x2d, 0xe5, 0x08, 0x76, 0xb2, 0xfd, 0x66, 0xcb, 0x67,
0x45, 0xfe, 0x13, 0x29, 0xe6, 0x13, 0xf5, 0x7c, 0x97, 0x57, 0xd0, 0x83, 0x9f, 0x01, 0x00, 0x00,
0xff, 0xff, 0x14, 0x1d, 0x29, 0xf8, 0x69, 0x09, 0x00, 0x00,
var fileDescriptor_third_aac767b0c26bb83e = []byte{
// 754 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xdf, 0x6e, 0xd3, 0x3e,
0x18, 0x55, 0xda, 0xb5, 0x5b, 0xbf, 0xee, 0xd7, 0xfd, 0x66, 0x4d, 0x10, 0x85, 0xb1, 0x75, 0x9e,
0x36, 0x7a, 0xb3, 0x56, 0x1a, 0x12, 0x7f, 0x04, 0x42, 0x6c, 0x43, 0x9d, 0x8a, 0xa8, 0x56, 0xa5,
0x2b, 0x17, 0xdc, 0xa0, 0xd0, 0xba, 0x6d, 0xb4, 0x34, 0x31, 0xb6, 0xb3, 0xc1, 0x5e, 0x00, 0x21,
0xee, 0x78, 0x1a, 0x2e, 0x79, 0x00, 0x1e, 0x0a, 0xc5, 0x49, 0xda, 0xa4, 0x4d, 0xda, 0x8d, 0x1b,
0xb8, 0x89, 0xec, 0x93, 0xf3, 0x1d, 0x1f, 0x7f, 0xf1, 0x71, 0x0b, 0xeb, 0x62, 0x68, 0xb2, 0x5e,
0x4d, 0x3e, 0xab, 0x94, 0x39, 0xc2, 0x41, 0xe8, 0x8c, 0x12, 0xbb, 0xd1, 0x6c, 0x13, 0x76, 0x49,
0x58, 0x55, 0xbe, 0xd1, 0x1e, 0x78, 0xd8, 0x41, 0xa3, 0x79, 0xe0, 0xa3, 0x35, 0x7a, 0x31, 0xa8,
0x49, 0x76, 0x8d, 0xf7, 0x2e, 0xae, 0x78, 0xed, 0x8a, 0xfb, 0xc5, 0xf8, 0x9b, 0x02, 0xc5, 0x23,
0x4a, 0xad, 0xcf, 0x2d, 0x57, 0xe8, 0xe4, 0x23, 0x42, 0xb0, 0x64, 0x1b, 0x23, 0xa2, 0x2a, 0x65,
0xa5, 0x52, 0xd0, 0xe5, 0xd8, 0xc3, 0xb8, 0x79, 0x4d, 0xd4, 0x4c, 0x59, 0xa9, 0x64, 0x75, 0x39,
0xf6, 0xb0, 0xa1, 0xc1, 0x87, 0x6a, 0xd6, 0xe7, 0x79, 0x63, 0x84, 0x61, 0xb5, 0xcf, 0x8c, 0xc1,
0x88, 0xd8, 0xa2, 0xed, 0xf1, 0x97, 0x24, 0x3f, 0x86, 0xa1, 0x4d, 0x28, 0x74, 0x2d, 0x62, 0xd8,
0xe7, 0xe6, 0x88, 0xa8, 0x39, 0x49, 0x98, 0x00, 0x58, 0xc0, 0xea, 0xc4, 0x0c, 0xa7, 0xe8, 0x7f,
0xc8, 0xba, 0xcc, 0x0a, 0xcc, 0x78, 0x43, 0xb4, 0x01, 0x39, 0xea, 0x8a, 0xc6, 0x2b, 0x69, 0xa6,
0xa0, 0xfb, 0x93, 0x99, 0x95, 0xb3, 0x09, 0x2b, 0xab, 0xb0, 0xdc, 0x72, 0x45, 0x47, 0x7f, 0xc3,
0xd5, 0x5c, 0x39, 0x5b, 0x29, 0xe8, 0xe1, 0x14, 0xef, 0xc1, 0x7f, 0x27, 0x8e, 0xdd, 0x37, 0xd9,
0x28, 0x68, 0xc2, 0x78, 0x11, 0x25, 0xb2, 0x08, 0xc6, 0x50, 0x8a, 0xd2, 0x92, 0xec, 0xe1, 0xa7,
0x50, 0x38, 0x25, 0xa2, 0xc3, 0xac, 0xb4, 0x5e, 0xaa, 0xb0, 0x4c, 0x3e, 0x51, 0x93, 0x11, 0x1e,
0xb4, 0x33, 0x9c, 0xe2, 0x3a, 0x40, 0x58, 0x9a, 0xb8, 0xf3, 0x1b, 0x7e, 0x05, 0xbc, 0x23, 0x2d,
0xcc, 0xdd, 0xc9, 0x13, 0x28, 0xf9, 0x94, 0x7a, 0xd0, 0xa0, 0xb1, 0xb8, 0x92, 0x20, 0x9e, 0x89,
0x88, 0xff, 0x52, 0xa4, 0xcb, 0xb0, 0x01, 0x7f, 0xf5, 0xb4, 0xa0, 0x97, 0x50, 0x08, 0xd9, 0x5c,
0xcd, 0x97, 0xb3, 0x95, 0xe2, 0x21, 0xae, 0xce, 0x86, 0xa1, 0x1a, 0xdf, 0xab, 0x3e, 0x29, 0xc2,
0x2f, 0x40, 0x3b, 0x25, 0xa2, 0x6d, 0x0e, 0x6c, 0xc3, 0x6a, 0xd8, 0x97, 0xa6, 0x30, 0x84, 0xe9,
0xd8, 0x0d, 0xbb, 0xef, 0x78, 0xcd, 0x2b, 0x43, 0xf1, 0xc4, 0x32, 0x89, 0x2d, 0x9a, 0x7c, 0x30,
0x6e, 0x61, 0x14, 0xc2, 0x3f, 0x14, 0xb8, 0x97, 0x2a, 0xc0, 0x29, 0x7a, 0x0d, 0x25, 0x33, 0x86,
0x4a, 0x91, 0x19, 0x9b, 0x32, 0x93, 0xd5, 0xa9, 0xfa, 0xa9, 0x4a, 0xd4, 0x84, 0x35, 0xa7, 0xdf,
0xb7, 0x4c, 0x9b, 0xb4, 0x5c, 0x3e, 0x94, 0x62, 0x19, 0x29, 0xb6, 0x9b, 0x24, 0x76, 0x16, 0xa7,
0xea, 0xd3, 0xb5, 0xf8, 0x39, 0xe0, 0x14, 0xe7, 0x6d, 0x61, 0x30, 0x71, 0x44, 0xa9, 0xd7, 0x82,
0x3b, 0x90, 0x77, 0x39, 0x61, 0xe3, 0xdd, 0x07, 0x33, 0xfc, 0x53, 0x81, 0xdd, 0x85, 0xe5, 0xff,
0x76, 0x03, 0xbe, 0x2a, 0xb0, 0x5e, 0xef, 0x8e, 0x3a, 0xb4, 0x67, 0x08, 0x72, 0xee, 0x5c, 0x10,
0xdb, 0xdb, 0xf0, 0x16, 0x40, 0xcb, 0x32, 0x44, 0xdf, 0x61, 0xa3, 0x60, 0xd3, 0x39, 0x3d, 0x82,
0x20, 0x0d, 0x56, 0xea, 0xdd, 0x91, 0xa4, 0x07, 0xc1, 0x18, 0xcf, 0xbd, 0x6c, 0x1b, 0xdd, 0xae,
0xe3, 0xda, 0x22, 0x38, 0xe8, 0xe1, 0xd4, 0x53, 0xf5, 0x63, 0x2e, 0x0f, 0xb2, 0x7f, 0xd2, 0x23,
0x08, 0xde, 0x00, 0x34, 0x6d, 0x85, 0x53, 0xdc, 0x82, 0x52, 0x9b, 0x78, 0xad, 0x3c, 0x36, 0x7a,
0x03, 0x32, 0xe7, 0x73, 0xa0, 0x7d, 0x28, 0x1d, 0x51, 0xda, 0xb1, 0x19, 0x31, 0x7a, 0x27, 0xd2,
0x40, 0x46, 0x3a, 0x9f, 0x42, 0xf1, 0x3a, 0xac, 0xc5, 0x14, 0x39, 0x3d, 0xfc, 0x92, 0x87, 0x9c,
0x8c, 0x09, 0x6a, 0xc2, 0x4a, 0x78, 0xf9, 0xa2, 0xed, 0xa4, 0x1c, 0x45, 0x7e, 0x27, 0xb4, 0xf2,
0x7c, 0x02, 0xa7, 0xe8, 0x14, 0xf2, 0x7e, 0xf0, 0xd0, 0xfd, 0xf4, 0x50, 0x7a, 0x52, 0x5b, 0xf3,
0x5e, 0x73, 0x8a, 0xda, 0x00, 0x93, 0x7b, 0x17, 0xed, 0x24, 0xb1, 0x63, 0xd7, 0xb7, 0x86, 0x17,
0x51, 0xc6, 0xee, 0x3a, 0xcc, 0x4a, 0x75, 0xe7, 0x5f, 0xe2, 0xa9, 0xee, 0xc2, 0x8b, 0xfa, 0x1a,
0xee, 0xa6, 0x04, 0x01, 0x55, 0x53, 0x4a, 0x53, 0xee, 0x1b, 0xad, 0x76, 0x2b, 0x3e, 0xa7, 0xe8,
0xbb, 0x02, 0xdb, 0x0b, 0x52, 0x88, 0x1e, 0xdd, 0x42, 0x34, 0x92, 0x7c, 0xed, 0xf1, 0x1f, 0xd5,
0x71, 0x8a, 0xde, 0x43, 0x29, 0x7e, 0x96, 0xd1, 0x5e, 0x92, 0xd4, 0x4c, 0xf4, 0xb4, 0xfd, 0x9b,
0xd0, 0x38, 0x45, 0x6f, 0xa1, 0x18, 0x39, 0xc4, 0x28, 0xf1, 0x6b, 0xc7, 0x73, 0xa3, 0xed, 0x2e,
0xe4, 0x70, 0x7a, 0xbc, 0xf5, 0x6e, 0xd3, 0x67, 0x45, 0xfe, 0x2d, 0x49, 0xe6, 0x33, 0xf9, 0xfc,
0x90, 0x97, 0xd0, 0xc3, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x87, 0x96, 0xee, 0x73, 0x83, 0x09,
0x00, 0x00,
}

View File

@ -28,7 +28,8 @@ message ConfirmPutResp {
}
message GetUrlReq {
string name = 1;
string name = 1; //
int64 expires = 2; // url有效时间
}
message GetUrlResp {