Skip to content

Commit bf8f6d6

Browse files
committed
add dfsclient
1 parent 54d13f6 commit bf8f6d6

File tree

4 files changed

+237
-12
lines changed

4 files changed

+237
-12
lines changed

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010

1111
### 大家担心的是这么简单的文件系统,靠不靠谱,可不可以用于生产环境?答案是肯定的,正因为简单所以高效,因为简单所以稳定。如果你担心功能,那就跑单元测试,如果担心性能,那就跑压力测试,项目都自带了,跑一跑更放心^_^。
1212

13-
注意:使用前请认真阅读[使用文档](https://sjqzhang.github.io/go-fastdfs/#character)
13+
注意:使用前请认真阅读[使用文档](https://sjqzhang.github.io/go-fastdfs/#character)[视频教程](https://www.bilibili.com/video/av92526484)
14+
15+
1416

1517
- 支持curl命令上传
1618
- 支持浏览器上传
@@ -86,3 +88,9 @@ http://yourserver ip:8080 注意:不要使用127.0.0.1上传
8688

8789
### [视频教程](https://www.bilibili.com/video/av92526484)
8890

91+
92+
#### 如果你觉得本项目不错,请点击项目顶部的 `star` 按钮关注本项目
93+
94+
> QQ交流群:964274270(go-fastdfs技术交流群)
95+
96+
同时要说明的是,该群是一个学习交流群,如果是程序相关问题,请直接提交issues,不接受邮件求助、微信求助和QQ私信求助

doc/benchmark.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ import (
88
"github.com/sjqzhang/goutil"
99
"io/ioutil"
1010
"os"
11-
"os/exec"
12-
"strings"
11+
"path/filepath"
1312
"sync"
1413
"time"
1514
)
@@ -30,15 +29,17 @@ func init() {
3029
util=goutil.Common{}
3130
}
3231

33-
func getDir(dir string) []string {
34-
cmd:=exec.Command("find",dir,"-type","f")
35-
var out bytes.Buffer
36-
cmd.Stdout = &out
37-
if err:=cmd.Run();err!=nil {
38-
fmt.Println(err)
39-
os.Exit(1)
40-
}
41-
return strings.Split( out.String(),"\n")
32+
func getDir(dir string) []string {
33+
var (
34+
paths []string
35+
)
36+
filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
37+
if !info.IsDir() {
38+
paths = append(paths, path)
39+
}
40+
return nil
41+
})
42+
return paths
4243
}
4344

4445
func sendFile() {

doc/dfsclient.go

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"github.com/astaxie/beego/httplib"
7+
"github.com/eventials/go-tus"
8+
"github.com/sjqzhang/goutil"
9+
"github.com/syndtr/goleveldb/leveldb"
10+
"net/http"
11+
"os"
12+
"path/filepath"
13+
"strings"
14+
"sync"
15+
"time"
16+
)
17+
18+
var url *string
19+
var dir *string
20+
var worker *int
21+
var queue chan string
22+
23+
var store tus.Store
24+
25+
//var filesize *int
26+
//var filecount *int
27+
//var retry *int
28+
//var gen *bool
29+
var scene *string
30+
var done chan bool = make(chan bool, 1)
31+
var wg sync.WaitGroup = sync.WaitGroup{}
32+
var util goutil.Common
33+
34+
type LeveldbStore struct {
35+
db *leveldb.DB
36+
}
37+
38+
func NewLeveldbStore(path string) (tus.Store, error) {
39+
db, err := leveldb.OpenFile(path, nil)
40+
if err != nil {
41+
return nil, err
42+
}
43+
44+
store := &LeveldbStore{db: db}
45+
return store, err
46+
}
47+
48+
func (s *LeveldbStore) Get(fingerprint string) (string, bool) {
49+
url, err := s.db.Get([]byte(fingerprint), nil)
50+
ok := true
51+
if err != nil {
52+
ok = false
53+
}
54+
return string(url), ok
55+
}
56+
57+
func (s *LeveldbStore) Set(fingerprint, url string) {
58+
s.db.Put([]byte(fingerprint), []byte(url), nil)
59+
}
60+
61+
func (s *LeveldbStore) Delete(fingerprint string) {
62+
s.db.Delete([]byte(fingerprint), nil)
63+
}
64+
65+
func (s *LeveldbStore) Close() {
66+
s.Close()
67+
}
68+
69+
func init() {
70+
util = goutil.Common{}
71+
defaultTransport := &http.Transport{
72+
DisableKeepAlives: true,
73+
Dial: httplib.TimeoutDialer(time.Second*15, time.Second*300),
74+
MaxIdleConns: 100,
75+
MaxIdleConnsPerHost: 100,
76+
}
77+
settins := httplib.BeegoHTTPSettings{
78+
UserAgent: "Go-FastDFS",
79+
ConnectTimeout: 15 * time.Second,
80+
ReadWriteTimeout: 15 * time.Second,
81+
Gzip: true,
82+
DumpBody: true,
83+
Transport: defaultTransport,
84+
}
85+
httplib.SetDefaultSetting(settins)
86+
87+
//store,_=NewLeveldbStore("upload.db")
88+
89+
}
90+
91+
func getDir(dir string) []string {
92+
var (
93+
paths []string
94+
)
95+
filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
96+
if !info.IsDir() {
97+
paths = append(paths, path)
98+
}
99+
return nil
100+
})
101+
return paths
102+
}
103+
104+
func sendFile() {
105+
106+
for {
107+
if len(queue) <= 0 {
108+
return
109+
}
110+
filePath := <-queue
111+
if strings.Index(*url, "/big/upload") > 0 {
112+
bigUpload(filePath)
113+
} else {
114+
normalUpload(filePath)
115+
}
116+
wg.Done()
117+
}
118+
119+
}
120+
121+
func normalUpload(filePath string) {
122+
defer func() {
123+
if re := recover(); re != nil {
124+
}
125+
}()
126+
req := httplib.Post(*url)
127+
req.PostFile("file", filePath) //注意不是全路径
128+
req.Param("output", "text")
129+
req.Param("scene", "")
130+
path := strings.Replace(filePath, *dir, "", 1)
131+
filename := filepath.Base(path)
132+
path = strings.Replace(filepath.Dir(path), "\\", "/", -1)
133+
req.Param("path", *scene+"/"+strings.TrimLeft(path, "/"))
134+
req.Param("filename", filename)
135+
req.Retries(-1)
136+
if s, err := req.String(); err != nil {
137+
fmt.Println(err, filePath)
138+
} else {
139+
fmt.Println(s, filePath)
140+
}
141+
142+
}
143+
144+
func bigUpload(filePath string) {
145+
defer func() {
146+
if re := recover(); re != nil {
147+
}
148+
}()
149+
f, err := os.Open(filePath)
150+
if err != nil {
151+
152+
panic(err)
153+
}
154+
defer f.Close()
155+
cfg := tus.DefaultConfig()
156+
//cfg.Store=store
157+
//cfg.Resume=true
158+
client, err := tus.NewClient(*url, cfg)
159+
if err != nil {
160+
fmt.Println(err)
161+
}
162+
upload, err := tus.NewUploadFromFile(f)
163+
if err != nil {
164+
fmt.Println(err)
165+
return
166+
}
167+
uploader, err := client.CreateOrResumeUpload(upload)
168+
if err != nil {
169+
fmt.Println(err)
170+
return
171+
}
172+
url := uploader.Url()
173+
err = uploader.Upload()
174+
fmt.Println(url, filePath)
175+
176+
}
177+
178+
func startWorker() {
179+
defer func() {
180+
if re := recover(); re != nil {
181+
}
182+
}()
183+
for i := 0; i < *worker; i++ {
184+
go sendFile()
185+
}
186+
}
187+
188+
func main() {
189+
190+
url = flag.String("url", "http://127.0.0.1:8080/group1/upload", "url")
191+
dir = flag.String("dir", "./", "dir to upload")
192+
worker = flag.Int("worker", 100, "num of worker")
193+
scene = flag.String("scene", "default", "scene")
194+
//retry=flag.Int("retry", -1, "retry times when fail")
195+
//uploadPath=flag.String("uploadPath", "./", "upload path")
196+
//filesize=flag.Int("filesize", 1024*1024, "file of size")
197+
//filecount=flag.Int("filecount", 1000000, "file of count")
198+
//gen=flag.Bool("gen", false, "gen file")
199+
flag.Parse()
200+
st := time.Now()
201+
//if *gen {
202+
// genFile()
203+
// fmt.Println(time.Since(st))
204+
// os.Exit(0)
205+
//}
206+
files := getDir(*dir)
207+
wg.Add(len(files))
208+
queue = make(chan string, len(files))
209+
for i := 0; i < len(files); i++ {
210+
queue <- files[i]
211+
}
212+
startWorker()
213+
wg.Wait()
214+
fmt.Println(time.Since(st))
215+
}

fileserver.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3462,6 +3462,7 @@ func (this *Server) GenGoogleSecret(w http.ResponseWriter, r *http.Request) {
34623462
if !this.IsPeer(r) {
34633463
result.Message = this.GetClusterNotPermitMessage(r)
34643464
w.Write([]byte(this.util.JsonEncodePretty(result)))
3465+
return
34653466
}
34663467
GetSeed := func(length int) string {
34673468
seeds := "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"

0 commit comments

Comments
 (0)