forked from Angey40/BaiduPCS-Go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
upload.go
87 lines (74 loc) · 1.92 KB
/
upload.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package pcsupload
import (
"context"
"github.com/iikira/BaiduPCS-Go/baidupcs"
"github.com/iikira/BaiduPCS-Go/internal/pcsconfig"
"github.com/iikira/BaiduPCS-Go/requester/multipartreader"
"github.com/iikira/BaiduPCS-Go/requester/rio"
"github.com/iikira/BaiduPCS-Go/requester/uploader"
"net/http"
)
type (
PCSUpload struct {
pcs *baidupcs.BaiduPCS
targetPath string
}
)
func NewPCSUpload(pcs *baidupcs.BaiduPCS, targetPath string) uploader.MultiUpload {
return &PCSUpload{
pcs: pcs,
targetPath: targetPath,
}
}
func (pu *PCSUpload) lazyInit() {
if pu.pcs == nil {
pu.pcs = &baidupcs.BaiduPCS{}
}
}
// Precreate do nothing
func (pu *PCSUpload) Precreate() (err error) {
return nil
}
func (pu *PCSUpload) TmpFile(ctx context.Context, partseq int, partOffset int64, r rio.ReaderLen64) (checksum string, uperr error) {
pu.lazyInit()
var respErr *uploader.MultiError
checksum, pcsError := pu.pcs.UploadTmpFile(func(uploadURL string, jar http.CookieJar) (resp *http.Response, err error) {
client := pcsconfig.Config.HTTPClient()
client.SetCookiejar(jar)
client.SetTimeout(0)
mr := multipartreader.NewMultipartReader()
mr.AddFormFile("uploadedfile", "", r)
mr.CloseMultipart()
doneChan := make(chan struct{}, 1)
go func() {
resp, err = client.Req("POST", uploadURL, mr, nil)
doneChan <- struct{}{}
if resp != nil {
// 不可恢复的错误
switch resp.StatusCode {
case 413:
respErr = &uploader.MultiError{
Terminated: true,
}
}
}
}()
select {
case <-ctx.Done(): // 取消
// 返回, 让那边关闭连接
return resp, ctx.Err()
case <-doneChan:
// return
}
return
})
if respErr != nil {
respErr.Err = pcsError
return checksum, respErr
}
return checksum, pcsError
}
func (pu *PCSUpload) CreateSuperFile(checksumList ...string) (err error) {
pu.lazyInit()
return pu.pcs.UploadCreateSuperFile(pu.targetPath, checksumList...)
}