1
1
package main
2
2
3
3
import (
4
+ "bytes"
4
5
"fmt"
6
+ "github.com/go-redis/redis"
7
+ "github.com/minio/minio-go"
5
8
"os"
9
+ "time"
6
10
)
7
11
12
+ var (
13
+ minioCore * minio.Core
14
+ redisClient * redis.Client
15
+ err error
16
+ )
17
+
18
+ func InitMinio () {
19
+ minioCore , err = minio .NewCore ("127.0.0.1:9000" , "AKIAINCHU2DIYAQ66TPA" , "ZaYtz0d61fJXQ7djyXBX4yZ5ob8Kj/WNXtw6PJob" , false )
20
+ CheckErr ("minio.New" , err )
21
+ }
22
+
23
+ func InitRedis () {
24
+ redisClient = redis .NewClient (& redis.Options {
25
+ Addr : "127.0.0.1:6379" ,
26
+ })
27
+ pong , err := redisClient .Ping ().Result ()
28
+ CheckErr (pong , err )
29
+ }
30
+
8
31
//分片上传文件
9
32
//分片文件小于5M 再redis缓存到5M在上传
10
33
func main () {
34
+ InitMinio ()
35
+ InitRedis ()
36
+ var (
37
+ bucket = "test"
38
+ name = "3.log"
39
+ uploadId string
40
+ completeParts []minio.CompletePart
41
+ maxSize = 1024 * 1024 * 5
42
+ )
11
43
44
+ uploadId , err = minioCore .NewMultipartUpload (bucket , name , minio.PutObjectOptions {})
45
+ CheckErr ("NewMultipartUpload" , err )
46
+ fmt .Println ("uploadId" , uploadId )
47
+ var j = 1
48
+ for i := 1 ; i < 20 ; i ++ {
49
+ //先判断文件大小是不是满足5M
50
+ time .Sleep (time .Second * 3 )
51
+ a := bytes .Repeat ([]byte (fmt .Sprint (1 )), 1024 * 1024 )
52
+ redisA , err := redisClient .Get (uploadId ).Bytes ()
53
+ if err != nil {
54
+ if err != redis .Nil {
55
+ fmt .Println ("redisClient.Get" , uploadId , err )
56
+ panic (err )
57
+ }
58
+ }
59
+ var data bytes.Buffer
60
+ data .Write (redisA )
61
+ data .Write (a )
62
+ fmt .Println ("index" , i , " 文件大小" , len (data .Bytes ())/ 1024 / 1024 )
63
+ if len (data .Bytes ()) < maxSize { //小于继续缓存
64
+ if i >= 19 { //最后一片
65
+ //最后一片直接上传
66
+ fmt .Println ("最后一片直接上传" )
67
+ } else {
68
+ fmt .Println (uploadId , "内容太小继续缓存" )
69
+ redisClient .Set (uploadId , data .Bytes (), time .Minute * 30 )
70
+ continue
71
+ }
12
72
73
+ }
74
+ part , err := minioCore .PutObjectPart (bucket , name , uploadId , j , bytes .NewReader (data .Bytes ()), int64 (len (data .Bytes ())), "" , "" , nil )
75
+ CheckErr ("PutObjectPart" , err )
76
+ completeParts = append (completeParts , minio.CompletePart {PartNumber : part .PartNumber , ETag : part .ETag })
77
+ fmt .Println ("uploadId :" , uploadId , "part :" , j , part )
78
+ //该缓存已经上传完毕删除该内容
79
+ fmt .Println ("uploadId :" , uploadId , redisClient .Del (uploadId ).String ())
80
+ j ++
81
+
82
+ }
83
+ _ , err = minioCore .CompleteMultipartUpload (bucket , name , uploadId , completeParts )
84
+ if err != nil {
85
+ panic (err )
86
+ }
87
+ fmt .Println ("上传文件成功" , uploadId )
13
88
}
14
89
15
90
func CheckErr (msg string , err error ) {
@@ -18,3 +93,49 @@ func CheckErr(msg string, err error) {
18
93
os .Exit (1 )
19
94
}
20
95
}
96
+
97
+ //uploadId 27ce1dec-f742-433e-a284-8eafeb22476b
98
+ //index 1 文件大小 1
99
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
100
+ //index 2 文件大小 2
101
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
102
+ //index 3 文件大小 3
103
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
104
+ //index 4 文件大小 4
105
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
106
+ //index 5 文件大小 5
107
+ //uploadId : 27ce1dec-f742-433e-a284-8eafeb22476b part : 1 {1 0001-01-01 00:00:00 +0000 UTC 7f0883388269a3eeb5b116b39ad81ee9-1 5242880}
108
+ //uploadId : 27ce1dec-f742-433e-a284-8eafeb22476b del 27ce1dec-f742-433e-a284-8eafeb22476b: 1
109
+ //index 6 文件大小 1
110
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
111
+ //index 7 文件大小 2
112
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
113
+ //index 8 文件大小 3
114
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
115
+ //index 9 文件大小 4
116
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
117
+ //index 10 文件大小 5
118
+ //uploadId : 27ce1dec-f742-433e-a284-8eafeb22476b part : 2 {2 0001-01-01 00:00:00 +0000 UTC 4de9698076020ddd32de7230316d8ce5-1 5242880}
119
+ //uploadId : 27ce1dec-f742-433e-a284-8eafeb22476b del 27ce1dec-f742-433e-a284-8eafeb22476b: 1
120
+ //index 11 文件大小 1
121
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
122
+ //index 12 文件大小 2
123
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
124
+ //index 13 文件大小 3
125
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
126
+ //index 14 文件大小 4
127
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
128
+ //index 15 文件大小 5
129
+ //uploadId : 27ce1dec-f742-433e-a284-8eafeb22476b part : 3 {3 0001-01-01 00:00:00 +0000 UTC 3717c6e04fe51d8028344be6059acef7-1 5242880}
130
+ //uploadId : 27ce1dec-f742-433e-a284-8eafeb22476b del 27ce1dec-f742-433e-a284-8eafeb22476b: 1
131
+ //index 16 文件大小 1
132
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
133
+ //index 17 文件大小 2
134
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
135
+ //index 18 文件大小 3
136
+ //27ce1dec-f742-433e-a284-8eafeb22476b 内容太小继续缓存
137
+ //index 19 文件大小 4
138
+ //最后一片直接上传
139
+ //uploadId : 27ce1dec-f742-433e-a284-8eafeb22476b part : 4 {4 0001-01-01 00:00:00 +0000 UTC e4c04a2710241b58b66fe51677acf3af-1 4194304}
140
+ //uploadId : 27ce1dec-f742-433e-a284-8eafeb22476b del 27ce1dec-f742-433e-a284-8eafeb22476b: 1
141
+ //上传文件成功 27ce1dec-f742-433e-a284-8eafeb22476b
0 commit comments