国庆这几天写的,套用阿里云的名称,就叫开放云存储服务吧,初衷只是想测试一下存储商的速度,后来发觉php写的SpeedTest不太好用,因为要依赖php和其他各个组件。
后来折腾了一下hiphop,这玩意依赖太过分了,用的很不爽,就用go重新实现了一遍存储的SDK。目前OCSS支持四个主流的云存储服务,包括盛大云,阿里云,又拍和七牛。它们的API是一样的(看起来是一样的,呵呵)
数据结构
在package fs里,有Object和Bucket,主要的结构如下,但不同的存储商的SDK又各有一些不同的地方,可看源码
type Object struct { EntryURI string Type string Mtime string Size int64 Body io.ReadWriter } type Bucket struct { EntryURI, Delimiter string Objs []*Object CommonPrefixes []string }
EntryURI通常由Bucket和Key组成,例如"/testbucket/resume.pdf"或者是"/testbucket/music/",Object可以表示一个文件或者目录。Bucket里的Delimiter是用来进行前缀查询的,会一直匹配到Delimiter才结束,然后返回的对象会保存到Objs和CommonPrefixes里,Objs通常可以理解成文件,CommonPrefixes可理解成当前路径下的文件夹名
存储API
所有的SDK都实现了如下的API,用法几乎是完全一样的,当然,还有其他的。
func (s *Service) Get(localfile, entryURI string) (code int, err error) func (s *Service) Put(entryURI, mimeType, localfile string) (code int, err error) func (s *Service) Delete(entryURI string) (code int, err error) func (s *Service) PutObject(o *fs.Object) (code int, err error) func (s *Service) GetObject(o *fs.Object) (code int, err error) func (s *Service) DelObject(o *fs.Object) (code int, err error) func (s *Service) NewBucket(b *fs.Bucket) (code int, err error) func (s *Service) DropBucket(b *fs.Bucket) (code int, err error) func (s *Service) ListBucket(b *fs.Bucket) (code int, err error)
Get/Put/Delete是简化的API,可以直接将某个文件作为一个Object上传,也可以直接将服务器上的某个Obejct保存到本地的localfile里。ListBucket可列Bucket或者目录。
用法
每个SDK目录下都有对应的单元测试文件,可参考这里,写的很拙劣,见笑了。