Skip to content
This repository was archived by the owner on Jul 11, 2019. It is now read-only.

Commit 379f0f4

Browse files
committed
init
0 parents  commit 379f0f4

File tree

3 files changed

+200
-0
lines changed

3 files changed

+200
-0
lines changed

driver.go

+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package qiniudriver
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"net/http"
7+
"strings"
8+
9+
"github.com/goftp/server"
10+
"github.com/qiniu/api/auth/digest"
11+
"github.com/qiniu/api/conf"
12+
qio "github.com/qiniu/api/io"
13+
"github.com/qiniu/api/rs"
14+
"github.com/qiniu/api/rsf"
15+
)
16+
17+
type QiniuDriver struct {
18+
curDir string
19+
client rs.Client
20+
client2 rsf.Client
21+
bucket string
22+
}
23+
24+
func (driver *QiniuDriver) ChangeDir(path string) error {
25+
driver.curDir = path
26+
return nil
27+
}
28+
29+
func (driver *QiniuDriver) Stat(key string) (server.FileInfo, error) {
30+
entry, err := driver.client.Stat(nil, driver.bucket, key)
31+
if err != nil {
32+
return nil, err
33+
}
34+
35+
return &FileInfo{key, entry}, nil
36+
}
37+
38+
func (driver *QiniuDriver) DirContents(prefix string) ([]server.FileInfo, error) {
39+
fmt.Print("bucket:", driver.bucket, "prefix:", strings.TrimLeft(prefix, "/"))
40+
entries, _, err := driver.client2.ListPrefix(nil, driver.bucket, strings.TrimLeft(prefix, "/"), "", 1000)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
files := make([]server.FileInfo, 0, len(entries))
46+
for _, entry := range entries {
47+
files = append(files, &FileInfo{
48+
name: entry.Key,
49+
Entry: rs.Entry{
50+
Hash: entry.Hash,
51+
Fsize: entry.Fsize,
52+
PutTime: entry.PutTime,
53+
MimeType: entry.MimeType,
54+
Customer: "",
55+
},
56+
})
57+
}
58+
59+
return files, nil
60+
}
61+
62+
func (driver *QiniuDriver) DeleteDir(key string) error {
63+
return driver.client.Delete(nil, driver.bucket, key)
64+
}
65+
66+
func (driver *QiniuDriver) DeleteFile(key string) error {
67+
return driver.client.Delete(nil, driver.bucket, key)
68+
}
69+
70+
func (driver *QiniuDriver) Rename(keySrc, keyDest string) error {
71+
return driver.client.Move(nil, driver.bucket,
72+
keySrc, driver.bucket, keyDest)
73+
}
74+
75+
func (driver *QiniuDriver) MakeDir(path string) error {
76+
return nil
77+
}
78+
79+
func (driver *QiniuDriver) GetFile(key string, start int64) (int64, io.ReadCloser, error) {
80+
stat, err := driver.Stat(key)
81+
if err != nil {
82+
return 0, nil, err
83+
}
84+
85+
domain := fmt.Sprintf("%s.qiniudn.com", driver.bucket)
86+
baseUrl := rs.MakeBaseUrl(domain, key)
87+
policy := rs.GetPolicy{}
88+
downUrl := policy.MakeRequest(baseUrl, nil)
89+
90+
resp, err := http.Get(downUrl)
91+
if err != nil {
92+
return 0, nil, err
93+
}
94+
95+
return stat.Size(), resp.Body, nil
96+
}
97+
98+
func (driver *QiniuDriver) PutFile(key string, data io.Reader, appendData bool) (int64, error) {
99+
var err error
100+
var ret qio.PutRet
101+
var extra = &qio.PutExtra{}
102+
103+
putPolicy := rs.PutPolicy{
104+
Scope: driver.bucket,
105+
}
106+
uptoken := putPolicy.Token(nil)
107+
108+
rd := CountReader(data)
109+
err = qio.Put(nil, &ret, uptoken, key, rd, extra)
110+
if err != nil {
111+
return 0, err
112+
}
113+
114+
return int64(rd.Size()), nil
115+
}
116+
117+
type QiniuDriverFactory struct {
118+
bucket string
119+
}
120+
121+
func NewQiniuDriverFactory(accessKey, secretKey, bucket string) server.DriverFactory {
122+
conf.ACCESS_KEY = accessKey
123+
conf.SECRET_KEY = secretKey
124+
return &QiniuDriverFactory{bucket}
125+
}
126+
127+
func (factory *QiniuDriverFactory) NewDriver() (server.Driver, error) {
128+
mac := &digest.Mac{conf.ACCESS_KEY, []byte(conf.SECRET_KEY)}
129+
client := rs.New(mac)
130+
client2 := rsf.New(mac)
131+
return &QiniuDriver{"/", client, client2, factory.bucket}, nil
132+
}

fileinfo.go

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package qiniudriver
2+
3+
import (
4+
"os"
5+
"time"
6+
7+
"github.com/qiniu/api/rs"
8+
)
9+
10+
type FileInfo struct {
11+
name string
12+
rs.Entry
13+
}
14+
15+
func (f *FileInfo) Name() string {
16+
return f.name
17+
}
18+
19+
func (f *FileInfo) Size() int64 {
20+
return f.Entry.Fsize
21+
}
22+
23+
func (f *FileInfo) Mode() os.FileMode {
24+
return os.ModePerm
25+
}
26+
27+
func (f *FileInfo) ModTime() time.Time {
28+
return time.Unix(0, f.Entry.PutTime*100)
29+
}
30+
31+
func (f *FileInfo) IsDir() bool {
32+
return false
33+
}
34+
35+
func (f *FileInfo) Sys() interface{} {
36+
return nil
37+
}
38+
39+
func (f *FileInfo) Owner() string {
40+
return "qiniu"
41+
}
42+
43+
func (f *FileInfo) Group() string {
44+
return "qiniu"
45+
}

io.go

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package qiniudriver
2+
3+
import "io"
4+
5+
type countReader struct {
6+
reader io.Reader
7+
counts int
8+
}
9+
10+
func (cr *countReader) Size() int {
11+
return cr.counts
12+
}
13+
14+
func (cr *countReader) Read(p []byte) (n int, err error) {
15+
rs, err := cr.reader.Read(p)
16+
cr.counts += rs
17+
return rs, err
18+
}
19+
20+
// CountReader returns a Reader that's is just for counting the total bytes of read.
21+
func CountReader(reader io.Reader) *countReader {
22+
return &countReader{reader, 0}
23+
}

0 commit comments

Comments
 (0)