Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/fs/put.go
1560 views
1
package fs
2
3
import (
4
"context"
5
"fmt"
6
"github.com/alist-org/alist/v3/internal/driver"
7
"github.com/alist-org/alist/v3/internal/errs"
8
"github.com/alist-org/alist/v3/internal/model"
9
"github.com/alist-org/alist/v3/internal/op"
10
"github.com/alist-org/alist/v3/internal/task"
11
"github.com/pkg/errors"
12
"github.com/xhofe/tache"
13
"time"
14
)
15
16
type UploadTask struct {
17
task.TaskExtension
18
storage driver.Driver
19
dstDirActualPath string
20
file model.FileStreamer
21
}
22
23
func (t *UploadTask) GetName() string {
24
return fmt.Sprintf("upload %s to [%s](%s)", t.file.GetName(), t.storage.GetStorage().MountPath, t.dstDirActualPath)
25
}
26
27
func (t *UploadTask) GetStatus() string {
28
return "uploading"
29
}
30
31
func (t *UploadTask) Run() error {
32
t.ClearEndTime()
33
t.SetStartTime(time.Now())
34
defer func() { t.SetEndTime(time.Now()) }()
35
return op.Put(t.Ctx(), t.storage, t.dstDirActualPath, t.file, t.SetProgress, true)
36
}
37
38
var UploadTaskManager *tache.Manager[*UploadTask]
39
40
// putAsTask add as a put task and return immediately
41
func putAsTask(ctx context.Context, dstDirPath string, file model.FileStreamer) (task.TaskExtensionInfo, error) {
42
storage, dstDirActualPath, err := op.GetStorageAndActualPath(dstDirPath)
43
if err != nil {
44
return nil, errors.WithMessage(err, "failed get storage")
45
}
46
if storage.Config().NoUpload {
47
return nil, errors.WithStack(errs.UploadNotSupported)
48
}
49
if file.NeedStore() {
50
_, err := file.CacheFullInTempFile()
51
if err != nil {
52
return nil, errors.Wrapf(err, "failed to create temp file")
53
}
54
//file.SetReader(tempFile)
55
//file.SetTmpFile(tempFile)
56
}
57
taskCreator, _ := ctx.Value("user").(*model.User) // taskCreator is nil when convert failed
58
t := &UploadTask{
59
TaskExtension: task.TaskExtension{
60
Creator: taskCreator,
61
},
62
storage: storage,
63
dstDirActualPath: dstDirActualPath,
64
file: file,
65
}
66
t.SetTotalBytes(file.GetSize())
67
UploadTaskManager.Add(t)
68
return t, nil
69
}
70
71
// putDirect put the file and return after finish
72
func putDirectly(ctx context.Context, dstDirPath string, file model.FileStreamer, lazyCache ...bool) error {
73
storage, dstDirActualPath, err := op.GetStorageAndActualPath(dstDirPath)
74
if err != nil {
75
return errors.WithMessage(err, "failed get storage")
76
}
77
if storage.Config().NoUpload {
78
return errors.WithStack(errs.UploadNotSupported)
79
}
80
return op.Put(ctx, storage, dstDirActualPath, file, nil, lazyCache...)
81
}
82
83