Skip to content

Commit 2e86f46

Browse files
committed
多线程上传及其他问题修复
1 parent fe10fae commit 2e86f46

File tree

6 files changed

+81
-43
lines changed

6 files changed

+81
-43
lines changed

README.md

+12-12
Original file line numberDiff line numberDiff line change
@@ -17,53 +17,53 @@ go get -u github.com/cnbattle/upcloud
1717

1818
### 功能
1919

20-
- [ ] 多线程上传
20+
- [x] 多线程上传
2121

2222
### 多平台
2323
- [x] 腾讯云
2424
- [x] 七牛云
2525
- [x] 阿里云
26-
- [ ] 华为云
27-
- [ ] 百度云
28-
- [ ] 滴滴云
29-
- [ ] UCloud
30-
- [ ] 青云 QingCloud
31-
- [ ] 京东智联云
32-
- [ ] AWS
33-
- [ ] Google Cloud
3426

3527
## 各平台`.upcloud.env`配置示例
3628

29+
- UP_CLOUD_PLATFORM: 平台
30+
- UP_CLOUD_PATH: 需上传静态资源路径
31+
- UP_CLOUD_POOL_SIZE: 上传时的并发数,默认为10
32+
- UP_CLOUD_PREFETCH_URLS: 上传完成,要刷新缓存的链接,VUE React等静态站点一般刷新首页index.html即可
33+
3734
### 腾讯云 COS
3835
```.env
3936
UP_CLOUD_PLATFORM=tencent
4037
UP_CLOUD_PATH=dist/
38+
UP_CLOUD_POOL_SIZE=10
39+
UP_CLOUD_PREFETCH_URLS=your prefetch urls (多个用,分割)
4140
4241
UP_CLOUD_SECRET_ID=your id
4342
UP_CLOUD_SECRET_KEY=your key
4443
UP_CLOUD_VISIT_NODE=your visis node
45-
UP_CLOUD_PREFETCH_URLS=your prefetch urls (多个用,分割)
4644
```
4745

4846
### 七牛云
4947
```.env
5048
UP_CLOUD_PLATFORM=qiniu
5149
UP_CLOUD_PATH=dist/
50+
UP_CLOUD_POOL_SIZE=10
51+
UP_CLOUD_PREFETCH_URLS=your prefetch urls (多个用,分割)
5252
5353
UP_CLOUD_ACCESS_KEY=your access key
5454
UP_CLOUD_SECRET_KEY=your secret key
5555
UP_CLOUD_BUCKET=your bucket
56-
UP_CLOUD_PREFETCH_URLS=your prefetch urls (多个用,分割)
5756
```
5857

5958
### 阿里云
6059
```.env
6160
UP_CLOUD_PLATFORM=aliyun
6261
UP_CLOUD_PATH=dist/
62+
UP_CLOUD_POOL_SIZE=10
63+
UP_CLOUD_PREFETCH_URLS=your prefetch urls (多个用,分割)
6364
6465
UP_CLOUD_ENDPOINT=your endpoint
6566
UP_CLOUD_ACCESS_KEY_ID=your access key id
6667
UP_CLOUD_ACCESS_KEY_SECRET=your access key secret
6768
UP_CLOUD_BUCKET=your bucket
68-
UP_CLOUD_PREFETCH_URLS=your prefetch urls (多个用,分割)
6969
```

cloud/qiniu.go

+18-7
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,24 @@ func (q *Qiniu) DelAll(list []string) error {
7070
deleteOps := make([]string, 0, len(list))
7171
for _, key := range list {
7272
deleteOps = append(deleteOps, storage.URIDelete(q.Bucket, key))
73+
if len(deleteOps) == 900 {
74+
rets, err := q.BucketManager.Batch(deleteOps)
75+
if err != nil {
76+
// 遇到错误
77+
if _, ok := err.(*rpc.ErrorInfo); ok {
78+
for _, ret := range rets {
79+
// 200 为成功
80+
fmt.Printf("%d\n", ret.Code)
81+
if ret.Code != 200 {
82+
fmt.Printf("%s\n", ret.Data.Error)
83+
}
84+
}
85+
} else {
86+
fmt.Printf("batch error, %s", err)
87+
}
88+
}
89+
deleteOps = make([]string, 0, len(list))
90+
}
7391
}
7492
rets, err := q.BucketManager.Batch(deleteOps)
7593
if err != nil {
@@ -92,16 +110,9 @@ func (q *Qiniu) DelAll(list []string) error {
92110
// Upload 上传
93111
func (q *Qiniu) Upload(localFile, upKey string) error {
94112
cfg := storage.Config{}
95-
// 空间对应的机房
96-
cfg.Zone = &storage.ZoneHuadong
97-
// 是否使用https域名
98-
cfg.UseHTTPS = false
99-
// 上传是否使用CDN上传加速
100-
cfg.UseCdnDomains = false
101113
// 构建表单上传的对象
102114
formUploader := storage.NewFormUploader(&cfg)
103115
ret := storage.PutRet{}
104-
105116
err := formUploader.PutFile(context.Background(), &ret, q.UpToken, upKey, localFile, nil)
106117
if err != nil {
107118
return err

cloud/tencent.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,23 @@ func (t *Tencent) GetAll() (list []string, err error) {
5555

5656
// DelAll 批量删除
5757
func (t *Tencent) DelAll(list []string) error {
58-
for _, item := range list {
59-
_, err := t.Client.Object.Delete(context.Background(), item)
58+
obs := []cos.Object{}
59+
for _, v := range list {
60+
obs = append(obs, cos.Object{Key: v})
61+
if len(obs) == 1000 {
62+
_, _, err := t.Client.Object.DeleteMulti(context.Background(), &cos.ObjectDeleteMultiOptions{
63+
Objects: obs,
64+
})
65+
if err != nil {
66+
return err
67+
}
68+
obs = []cos.Object{}
69+
}
70+
}
71+
if len(obs) > 0 {
72+
_, _, err := t.Client.Object.DeleteMulti(context.Background(), &cos.ObjectDeleteMultiOptions{
73+
Objects: obs,
74+
})
6075
if err != nil {
6176
return err
6277
}

go.mod

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ module github.com/cnbattle/upcloud
33
go 1.15
44

55
require (
6-
github.com/aliyun/alibaba-cloud-sdk-go v1.61.861
6+
github.com/aliyun/alibaba-cloud-sdk-go v1.61.871
77
github.com/aliyun/aliyun-oss-go-sdk v2.1.6+incompatible
88
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
99
github.com/joho/godotenv v1.3.0
10+
github.com/panjf2000/ants/v2 v2.4.3
1011
github.com/qiniu/api.v7/v7 v7.8.1
1112
github.com/satori/go.uuid v1.2.0 // indirect
12-
github.com/tencentcloud/tencentcloud-sdk-go v1.0.86
13+
github.com/tencentcloud/tencentcloud-sdk-go v1.0.90
1314
github.com/tencentyun/cos-go-sdk-v5 v0.7.18
1415
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect
15-
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
1616
)

go.sum

+13-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
2-
github.com/aliyun/alibaba-cloud-sdk-go v1.61.861 h1:ObMc47c1NA6NRUGbWlEdaARjGZ+imLsrH7k7dD2BGyw=
3-
github.com/aliyun/alibaba-cloud-sdk-go v1.61.861/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA=
2+
github.com/aliyun/alibaba-cloud-sdk-go v1.61.871 h1:wt03k4D/3d4jqovp0+uS1JVHtAWD8XbJh8f/sA/EQ/8=
3+
github.com/aliyun/alibaba-cloud-sdk-go v1.61.871/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA=
44
github.com/aliyun/aliyun-oss-go-sdk v2.1.6+incompatible h1:Ft+KeWIJxFP76LqgJbvtOA1qBIoC8vGkTV3QeCOeJC4=
55
github.com/aliyun/aliyun-oss-go-sdk v2.1.6+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
66
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
@@ -23,17 +23,14 @@ github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswD
2323
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
2424
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
2525
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
26-
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
27-
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
28-
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
29-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
30-
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
3126
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
3227
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
3328
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
3429
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
3530
github.com/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=
3631
github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60=
32+
github.com/panjf2000/ants/v2 v2.4.3 h1:wHghL17YKFanB62QjPQ9o+DuM4q7WrQ7zAhoX8+eBXU=
33+
github.com/panjf2000/ants/v2 v2.4.3/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A=
3734
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3835
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3936
github.com/qiniu/api.v7/v7 v7.8.1 h1:2+kFmiyhwiOYWkyKN8euuHe0DP3YQ3z+dAD48Tvt9gE=
@@ -47,8 +44,10 @@ github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:s
4744
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
4845
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
4946
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
50-
github.com/tencentcloud/tencentcloud-sdk-go v1.0.86 h1:/kFWJ407xMEJPcavoa09kqO8xq96Je9qJ3JtdpHNvDc=
51-
github.com/tencentcloud/tencentcloud-sdk-go v1.0.86/go.mod h1:asUz5BPXxgoPGaRgZaVm1iGcUAuHyYUo1nXqKa83cvI=
47+
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
48+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
49+
github.com/tencentcloud/tencentcloud-sdk-go v1.0.90 h1:/Ih44Gj8fVbz1zrP8z8XkeRch8X+WRyP+1hupLxI6HE=
50+
github.com/tencentcloud/tencentcloud-sdk-go v1.0.90/go.mod h1:asUz5BPXxgoPGaRgZaVm1iGcUAuHyYUo1nXqKa83cvI=
5251
github.com/tencentyun/cos-go-sdk-v5 v0.7.18 h1:hiHAC24LWVIeE5JriNUmCqe2BVLtN0RRsCjyE2glpEg=
5352
github.com/tencentyun/cos-go-sdk-v5 v0.7.18/go.mod h1:wQBO5HdAkLjj2q6XQiIfDSP8DXDNrppDRw2Kp/1BODA=
5453
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -60,7 +59,10 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
6059
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE=
6160
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
6261
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
63-
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
64-
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
62+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
63+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6564
gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk=
6665
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
66+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
67+
gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
68+
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

upcloud.go

+18-8
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@ package main
22

33
import (
44
"fmt"
5+
"strings"
6+
"sync"
7+
58
"github.com/cnbattle/upcloud/config"
69
"github.com/cnbattle/upcloud/utils"
7-
"strings"
10+
11+
"github.com/panjf2000/ants/v2"
812
)
913

1014
func main() {
@@ -30,15 +34,21 @@ func main() {
3034
// 上传新的文件
3135
fmt.Println("Start uploading data.")
3236
files := utils.Local(config.GetEnvForPanic("UP_CLOUD_PATH"))
37+
pool, _ := ants.NewPool(config.GetDefaultEnvToInt("UP_CLOUD_POOL_SIZE", 10))
38+
defer pool.Release()
39+
var wg sync.WaitGroup
3340
for _, file := range files {
34-
fmt.Println(file)
35-
//fmt.Print(".")
36-
err := commInterface.Upload(file.Local, file.UpKey)
37-
if err != nil {
38-
fmt.Println("commInterface.Upload error:", err)
39-
return
40-
}
41+
wg.Add(1)
42+
_ = pool.Submit(func() {
43+
err := commInterface.Upload(file.Local, file.UpKey)
44+
if err != nil {
45+
fmt.Println("commInterface.Upload error:", err)
46+
}
47+
fmt.Print(".")
48+
wg.Done()
49+
})
4150
}
51+
wg.Wait()
4252
fmt.Println()
4353
fmt.Println("Start refreshing CDN data.")
4454
prefetch := config.GetEnvForPanic("UP_CLOUD_PREFETCH_URLS")

0 commit comments

Comments
 (0)