kodo

package
v1.5.2 Latest Latest
Warning

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

Go to latest
Published: Jul 16, 2023 License: MIT Imports: 15 Imported by: 0

Documentation

Overview

Package kodo 提供了在您的业务服务器(服务端)调用七牛云存储服务的能力

首先,我们要配置下 accessKey/secretKey,这可以在七牛 Portal 中查到:

kodo.SetMac("your-access-key", "your-secret-key")

然后我们创建一个 Client 对象:

zone := 0 // 您空间(Bucket)所在的区域
c := kodo.NewClient(zone, nil) // 用默认配置创建 Client

有了 Client,你就可以操作您的空间(Bucket)了,比如我们要上传一个文件:

import "golang.org/x/net/context"

bucket := c.Bucket("your-bucket-name")
ctx := context.Background()
...
localFile := "/your/local/image/file.jpg"
err := bucket.PutFile(ctx, nil, "foo/bar.jpg", localFile, nil)
if err != nil {
	... // 上传文件失败处理
	return
}
// 上传文件成功
// 这时登录七牛Portal,在 your-bucket-name 空间就可以看到一个 foo/bar.jpg 的文件了

当然,除了上传文件,各种空间(Bucket)相关的操作都可以有,最常见自然是增删改查了:

entry, err := bucket.Stat(ctx, "foo/bar.jpg") // 看看空间中是否存在某个文件,其属性是什么
bucket.Delete(ctx, "foo/bar.jpg") // 删除空间中的某个文件
bucket.ChangeMime(ctx, "foo/bar.jpg", "image/jpeg") // 修改某个文件的 MIME 属性
bucket.Move(ctx, "foo/bar.jpg", "new-name.jpg") // 移动文件
bucket.Copy(ctx, "foo/bar.jpg", "new-copy-file.jpg") // 复制文件

等等... 请问怎么下载文件?如果是公开文件,我们只需要:

import "net/http"

domain := "domain-of-your-bucket.com" // 您的空间绑定的域名,这个可以在七牛的Portal中查到
baseUrl := kodo.MakeBaseUrl(domain, "foo/bar.jpg") // 得到下载 url
resp, err := http.Get(baseUrl)
...

但是对于私有空间,事情要复杂一些,访问上面的 baseUrl 会被拒绝。我们需要多做一步:

privateUrl := c.MakePrivateUrl(baseUrl, nil) // 用默认的下载策略去生成私有下载的 url
resp, err := http.Get(privateUrl)
...

Index

Constants

View Source
const (
	TypeNormal = iota
	TypeLine
)

Variables

This section is empty.

Functions

func MakeBaseUrl

func MakeBaseUrl(domain, key string) (baseUrl string)

MakeBaseUrl 根据空间(Bucket)的域名,以及文件的 key,获得 baseUrl。 如果空间是 public 的,那么通过 baseUrl 可以直接下载文件内容。 如果空间是 private 的,那么需要对 baseUrl 进行私有签名得到一个临时有效的 privateUrl 进行下载。

func URIChangeMime

func URIChangeMime(bucket, key, mime string) string

func URIChangeType

func URIChangeType(bucket, key string, Type FileType) string

func URICopy

func URICopy(bucketSrc, keySrc, bucketDest, keyDest string) string

func URIDelete

func URIDelete(bucket, key string) string

func URIMove

func URIMove(bucketSrc, keySrc, bucketDest, keyDest string) string

func URIRename

func URIRename(bucketSrc, keySrc, bucketDest, keyDest string) string

func URIStat

func URIStat(bucket, key string) string

Types

type BatchItemRet

type BatchItemRet struct {
	Error string `json:"error"`
	Code  int    `json:"code"`
}

type BatchStatItemRet

type BatchStatItemRet struct {
	Data  Entry  `json:"data"`
	Error string `json:"error"`
	Code  int    `json:"code"`
}

type Bucket

type Bucket struct {
	Conn *Client
	Name string
}

func NewBucket

func NewBucket(client *Client, name string) *Bucket

NewBucket 取七牛空间(bucket)的对象实例 @param client 七牛kodo客户端 @param name bucket名称

func (Bucket) BatchCopy

func (p Bucket) BatchCopy(ctx context.Context, entries ...KeyPair) (ret []BatchItemRet, err error)

func (Bucket) BatchDelete

func (p Bucket) BatchDelete(ctx context.Context, keys ...string) (ret []BatchItemRet, err error)

func (Bucket) BatchMove

func (p Bucket) BatchMove(ctx context.Context, entries ...KeyPairEx) (ret []BatchItemRet, err error)

func (Bucket) BatchRename

func (p Bucket) BatchRename(ctx context.Context, entries ...KeyPair) (ret []BatchItemRet, err error)

BatchRename 批量重命名 该操作没有批量api,需要goroutine模拟实现

func (Bucket) BatchStat

func (p Bucket) BatchStat(ctx context.Context, keys ...string) (ret []BatchStatItemRet, err error)

func (Bucket) ChangeMime

func (p Bucket) ChangeMime(ctx context.Context, key, mime string) (err error)

ChangeMime 修改文件的MIME类型。 @param ctx 是请求的上下文。 @param key 是要修改的文件的访问路径。 @param mime 是要设置的新MIME类型。

func (Bucket) Copy

func (p Bucket) Copy(ctx context.Context, keySrc, keyDest string) (err error)

Copy 复制一个文件。 @param ctx 是请求的上下文。 @param keySrc 是要复制的文件的源路径。 @param keyDest 是要复制的文件的目标路径。

func (Bucket) Delete

func (p Bucket) Delete(ctx context.Context, key string) (err error)

Delete 删除一个文件 @param ctx 是请求的上下文 @param key 是要删除的文件的访问路径

func (Bucket) Fetch

func (p Bucket) Fetch(ctx context.Context, key string, url string) (err error)

Fetch 从网上抓取一个资源并存储到七牛空间(bucket)中 @param ctx 是请求的上下文 @param key 是要存储的文件的访问路径。如果文件已经存在则覆盖 @param url 是要抓取的资源的URL

func (Bucket) List

func (p Bucket) List(
	ctx context.Context, prefix, delimiter, marker string, limit int) (entries []ListItem, commonPrefixes []string, markerOut string, err error)

List 首次请求,请将 marker 设置为 ""。 无论 err 值如何,均应该先看 entries 是否有内容。 如果后续没有更多数据,err 返回 EOF,markerOut 返回 ""(但不通过该特征来判断是否结束)。

func (Bucket) Move

func (p Bucket) Move(ctx context.Context, keySrc, keyDest string) (err error)

Move 移动一个文件。 @param ctx 是请求的上下文。 @param keySrc 是要移动的文件的旧路径。 @param keyDest 是要移动的文件的新路径。

func (Bucket) MoveEx

func (p Bucket) MoveEx(ctx context.Context, keySrc, bucketDest, keyDest string) (err error)

MoveEx 跨空间(bucket)移动一个文件。 @param ctx 是请求的上下文。 @param keySrc 是要移动的文件的旧路径。 @param bucketDest 是文件的目标空间。 @param keyDest 是要移动的文件的新路径。

func (Bucket) Put

func (p Bucket) Put(
	ctx context.Context,
	ret interface{},
	key string,
	data io.Reader,
	size int64,
	extra *PutExtra,
) error

Put 上传一个文件。 ctx 是请求的上下文。 ret 是上传成功后返回的数据。返回的是 PutRet 结构。可选,可以传 nil 表示不感兴趣。 key 是要上传的文件访问路径。比如:"foo/bar.jpg"。注意我们建议 key 不要以 '/' 开头。另外,key 为空字符串是合法的。 data 是文件内容的访问接口(io.Reader)。 fsize 是要上传的文件大小。 extra 是上传的一些可选项。详细见 PutExtra 结构的描述。

func (Bucket) PutFile

func (p Bucket) PutFile(
	ctx context.Context,
	ret interface{},
	key, localFile string,
	extra *PutExtra,
) error

PutFile 上传一个文件。 和 Put 不同的只是一个通过提供文件路径来访问文件内容,一个通过 io.Reader 来访问。

ctx 是请求的上下文。 ret 是上传成功后返回的数据。返回的是 PutRet 结构。可选,可以传 nil 表示不感兴趣。 localFile 是要上传的文件的本地路径。 extra 是上传的一些可选项。详细见 PutExtra 结构的描述。

func (Bucket) PutFileWithoutKey

func (p Bucket) PutFileWithoutKey(
	ctx context.Context,
	ret interface{},
	localFile string,
	extra *PutExtra,
) error

PutFileWithoutKey 上传一个文件。自动以文件的 hash 作为文件的访问路径(key)。 和 PutWithoutKey 不同的只是一个通过提供文件路径来访问文件内容,一个通过 io.Reader 来访问。

ctx 是请求的上下文。 ret 是上传成功后返回的数据。返回的是 PutRet 结构。可选,可以传 nil 表示不感兴趣。 localFile 是要上传的文件的本地路径。 extra 是上传的一些可选项。详细见 PutExtra 结构的描述。

func (Bucket) PutWithoutKey

func (p Bucket) PutWithoutKey(
	ctx context.Context,
	ret interface{},
	data io.Reader,
	size int64,
	extra *PutExtra,
) error

PutWithoutKey 上传一个文件。自动以文件的 hash 作为文件的访问路径(key) ctx 是请求的上下文。 ret 是上传成功后返回的数据。返回的是 PutRet 结构。可选,可以传 nil 表示不感兴趣。 data 是文件内容的访问接口(io.Reader)。 fsize 是要上传的文件大小。 extra 是上传的一些可选项。详细见 PutExtra 结构的描述。

func (Bucket) Rename

func (p Bucket) Rename(ctx context.Context, keySrc, keyDest string) (err error)

Rename 重命名一个文件。 @param ctx 是请求的上下文。 @param keySrc 是要移动的文件的旧路径。 @param keyDest 是要移动的文件的新路径。

func (Bucket) Rput

func (p Bucket) Rput(
	ctx context.Context,
	ret interface{},
	key string,
	data io.ReaderAt,
	size int64,
	extra *RputExtra,
) error

Rput 上传一个文件,支持断点续传和分块上传。

ctx 是请求的上下文。 ret 是上传成功后返回的数据。如果 upToken 中没有设置 CallbackUrl 或 ReturnBody,那么返回的数据结构是 PutRet 结构。 key 是要上传的文件访问路径。比如:"foo/bar.jpg"。注意我们建议 key 不要以 '/' 开头。另外,key 为空字符串是合法的。 data 是文件内容的访问接口。考虑到需要支持分块上传和断点续传,要的是 io.ReaderAt 接口,而不是 io.Reader。 fsize 是要上传的文件大小。 extra 是上传的一些可选项。详细见 RputExtra 结构的描述。

func (Bucket) RputFile

func (p Bucket) RputFile(
	ctx context.Context,
	ret interface{},
	key, localFile string,
	extra *RputExtra,
) error

RputFile 上传一个文件,支持断点续传和分块上传。 和 Rput 不同的只是一个通过提供文件路径来访问文件内容,一个通过 io.ReaderAt 来访问。

ctx 是请求的上下文。 ret 是上传成功后返回的数据。如果 upToken 中没有设置 CallbackUrl 或 ReturnBody,那么返回的数据结构是 PutRet 结构。 key 是要上传的文件访问路径。比如:"foo/bar.jpg"。注意我们建议 key 不要以 '/' 开头。另外,key 为空字符串是合法的。 localFile 是要上传的文件的本地路径。 extra 是上传的一些可选项。详细见 RputExtra 结构的描述。

func (Bucket) RputFileWithoutKey

func (p Bucket) RputFileWithoutKey(
	ctx context.Context,
	ret interface{},
	localFile string,
	extra *RputExtra,
) error

RputFileWithoutKey 上传一个文件,支持断点续传和分块上传。自动以文件的 hash 作为文件的访问路径(key)。 和 RputWithoutKey 不同的只是一个通过提供文件路径来访问文件内容,一个通过 io.ReaderAt 来访问。

ctx 是请求的上下文。 ret 是上传成功后返回的数据。如果 upToken 中没有设置 CallbackUrl 或 ReturnBody,那么返回的数据结构是 PutRet 结构。 localFile 是要上传的文件的本地路径。 extra 是上传的一些可选项。详细见 RputExtra 结构的描述。

func (Bucket) RputWithoutKey

func (p Bucket) RputWithoutKey(
	ctx context.Context,
	ret interface{},
	data io.ReaderAt,
	size int64,
	extra *RputExtra,
) error

RputWithoutKey 上传一个文件,支持断点续传和分块上传。自动以文件的 hash 作为文件的访问路径(key)。 ctx 是请求的上下文。 ret 是上传成功后返回的数据。如果 upToken 中没有设置 CallbackUrl 或 ReturnBody,那么返回的数据结构是 PutRet 结构。 data 是文件内容的访问接口。考虑到需要支持分块上传和断点续传,要的是 io.ReaderAt 接口,而不是 io.Reader。 fsize 是要上传的文件大小。 extra 是上传的一些可选项。详细见 RputExtra 结构的描述。

func (Bucket) Stat

func (p Bucket) Stat(ctx context.Context, key string) (entry Entry, err error)

Stat 取文件属性 @param ctx 是请求的上下文 @param key 是要访问的文件的访问路径

type Client

type Client struct {
	rpc.Client
	Config
	// contains filtered or unexported fields
}

func NewClient

func NewClient(cfg *Config) *Client

func (*Client) Batch

func (p *Client) Batch(ctx context.Context, ret interface{}, op []string) (err error)

Batch 批量操作

func (*Client) MakePrivateUrl

func (p *Client) MakePrivateUrl(baseUrl string, policy *GetPolicy) (privateUrl string)

func (*Client) MakeUpToken

func (p *Client) MakeUpToken(policy *PutPolicy) string

MakeUpToken 根据给定的上传策略构造一个上传凭证

func (*Client) MakeUpTokenWithExpires

func (p *Client) MakeUpTokenWithExpires(policy *PutPolicy, expires uint32) string

MakeUpTokenWithExpires 根据给定的上传策略和有效时间构造一个上传凭证, 有效时间单位为秒,将与上传策略中的过期时间叠加。

type Config

type Config struct {
	AccessKey string
	SecretKey string
	RSHost    string
	RSFHost   string
	APIHost   string
	Scheme    string
	IoHost    string
	UpHosts   []string
	Transport http.RoundTripper
}

type Entry

type Entry struct {
	Hash     string `json:"hash"`
	Fsize    int64  `json:"fsize"`
	PutTime  int64  `json:"putTime"`
	MimeType string `json:"mimeType"`
	EndUser  string `json:"endUser"`
}

type FileType

type FileType uint32

type GetPolicy

type GetPolicy struct {
	Expires uint32
}

type KeyPair

type KeyPair struct {
	SrcKey  string
	DestKey string
}

type KeyPairEx

type KeyPairEx struct {
	SrcKey     string
	DestKey    string
	DestBucket string
}

type ListItem

type ListItem struct {
	Key      string `json:"key"`
	Hash     string `json:"hash"`
	Fsize    int64  `json:"fsize"`
	PutTime  int64  `json:"putTime"`
	MimeType string `json:"mimeType"`
	EndUser  string `json:"endUser"`
}

type PutExtra

type PutExtra kodocli.PutExtra

type PutPolicy

type PutPolicy struct {
	Scope               string   `json:"scope"`
	Deadline            uint32   `json:"deadline"`             // 截止时间(以秒为单位)
	InsertOnly          uint16   `json:"insertOnly,omitempty"` // 若非0, 即使Scope为 Bucket:Key 的形式也是insert only
	DetectMime          uint8    `json:"detectMime,omitempty"` // 若非0, 则服务端根据内容自动确定 MimeType
	CallbackFetchKey    uint8    `json:"callbackFetchKey,omitempty"`
	FsizeLimit          int64    `json:"fsizeLimit,omitempty"`
	MimeLimit           string   `json:"mimeLimit,omitempty"`
	SaveKey             string   `json:"saveKey,omitempty"`
	CallbackUrl         string   `json:"callbackUrl,omitempty"`
	CallbackHost        string   `json:"callbackHost,omitempty"`
	CallbackBody        string   `json:"callbackBody,omitempty"`
	CallbackBodyType    string   `json:"callbackBodyType,omitempty"`
	ReturnUrl           string   `json:"returnUrl,omitempty"`
	ReturnBody          string   `json:"returnBody,omitempty"`
	PersistentOps       string   `json:"persistentOps,omitempty"`
	PersistentNotifyUrl string   `json:"persistentNotifyUrl,omitempty"`
	PersistentPipeline  string   `json:"persistentPipeline,omitempty"`
	AsyncOps            string   `json:"asyncOps,omitempty"`
	EndUser             string   `json:"endUser,omitempty"`
	Checksum            string   `json:"checksum,omitempty"` // 格式:<HashName>:<HexHashValue>,目前支持 MD5/SHA1。
	UpHosts             []string `json:"uphosts,omitempty"`
	NotifyQueue         string   `json:"notifyQueue,omitempty"`
	NotifyMessage       string   `json:"notifyMessage,omitempty"`
	NotifyMessageType   string   `json:"notifyMessageType,omitempty"`
	DeleteAfterDays     int      `json:"deleteAfterDays,omitempty"`
	FileType            FileType `json:"fileType,omitempty"`
}

type PutRet

type PutRet kodocli.PutRet

type RputExtra

type RputExtra kodocli.RputExtra

Jump to

Keyboard shortcuts

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