Skip to content

Commit 6639cab

Browse files
committedNov 7, 2022
feat(google_drive): chunk upload (close #2241)
1 parent 8241f09 commit 6639cab

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed
 

‎drivers/google_drive/driver.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ func (d *GoogleDrive) Init(ctx context.Context, storage model.Storage) error {
3636
if err != nil {
3737
return err
3838
}
39+
if d.ChunkSize == 0 {
40+
d.ChunkSize = 5
41+
}
3942
return d.refreshToken()
4043
}
4144

@@ -160,9 +163,13 @@ func (d *GoogleDrive) Put(ctx context.Context, dstDir model.Obj, stream model.Fi
160163
return fmt.Errorf("%s: %v", e.Error.Message, e.Error.Errors)
161164
}
162165
putUrl := res.Header().Get("location")
163-
_, err = d.request(putUrl, http.MethodPut, func(req *resty.Request) {
164-
req.SetHeader("Content-Length", strconv.FormatInt(stream.GetSize(), 10)).SetBody(stream.GetReadCloser())
165-
}, nil)
166+
if stream.GetSize() < d.ChunkSize*1024*1024 {
167+
_, err = d.request(putUrl, http.MethodPut, func(req *resty.Request) {
168+
req.SetHeader("Content-Length", strconv.FormatInt(stream.GetSize(), 10)).SetBody(stream.GetReadCloser())
169+
}, nil)
170+
} else {
171+
err = d.chunkUpload(ctx, stream, putUrl)
172+
}
166173
return err
167174
}
168175

‎drivers/google_drive/meta.go

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ type Addition struct {
1212
OrderDirection string `json:"order_direction" type:"select" options:"asc,desc"`
1313
ClientID string `json:"client_id" required:"true" default:"202264815644.apps.googleusercontent.com"`
1414
ClientSecret string `json:"client_secret" required:"true" default:"X4Z3ca8xfWDb1Voo-F9a7ZxJ"`
15+
ChunkSize int64 `json:"chunk_size" default:"5" help:"chunk size while uploading (unit: MB)"`
1516
}
1617

1718
var config = driver.Config{

‎drivers/google_drive/util.go

+26
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package google_drive
22

33
import (
4+
"context"
45
"fmt"
6+
"io"
57
"net/http"
8+
"strconv"
69

710
"github.com/alist-org/alist/v3/drivers/base"
11+
"github.com/alist-org/alist/v3/internal/model"
812
"github.com/go-resty/resty/v2"
913
log "github.com/sirupsen/logrus"
1014
)
@@ -95,3 +99,25 @@ func (d *GoogleDrive) getFiles(id string) ([]File, error) {
9599
}
96100
return res, nil
97101
}
102+
103+
func (d *GoogleDrive) chunkUpload(ctx context.Context, stream model.FileStreamer, url string) error {
104+
var defaultChunkSize = d.ChunkSize * 1024 * 1024
105+
var finish int64 = 0
106+
for finish < stream.GetSize() {
107+
chunkSize := stream.GetSize() - finish
108+
if chunkSize > defaultChunkSize {
109+
chunkSize = defaultChunkSize
110+
}
111+
_, err := d.request(url, http.MethodPut, func(req *resty.Request) {
112+
req.SetHeaders(map[string]string{
113+
"Content-Length": strconv.FormatInt(chunkSize, 10),
114+
"Content-Range": fmt.Sprintf("bytes %d-%d/%d", finish, finish+chunkSize-1, stream.GetSize()),
115+
}).SetBody(io.LimitReader(stream.GetReadCloser(), chunkSize))
116+
}, nil)
117+
if err != nil {
118+
return err
119+
}
120+
finish += chunkSize
121+
}
122+
return nil
123+
}

0 commit comments

Comments
 (0)