Files
waf-platform/EdgeUser/internal/web/actions/actionutils/parent_action_file.go
2026-02-04 20:27:13 +08:00

60 lines
1.4 KiB
Go

// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package actionutils
import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeUser/internal/utils/sizes"
"github.com/iwind/TeaGo/actions"
"io"
)
func (this *ParentAction) UploadFile(formFile *actions.File, businessType string) (fileId int64, ok bool, err error) {
file, err := formFile.OriginFile.Open()
if err != nil {
return 0, false, err
}
fileResp, err := this.RPC().FileRPC().CreateFile(this.UserContext(), &pb.CreateFileRequest{
Filename: formFile.Filename,
Size: formFile.Size,
IsPublic: false,
MimeType: formFile.ContentType,
Type: businessType,
})
if err != nil {
return 0, false, err
}
fileId = fileResp.FileId
var buf = make([]byte, 128*sizes.K) // TODO 使用pool管理
for {
n, err := file.Read(buf)
if n > 0 {
_, chunkErr := this.RPC().FileChunkRPC().CreateFileChunk(this.UserContext(), &pb.CreateFileChunkRequest{
FileId: fileId,
Data: buf[:n],
})
if chunkErr != nil {
return 0, false, chunkErr
}
}
if err != nil {
if err != io.EOF {
return 0, false, nil
}
break
}
}
_, err = this.RPC().FileRPC().UpdateFileFinished(this.UserContext(), &pb.UpdateFileFinishedRequest{
FileId: fileId,
})
if err != nil {
return 0, false, err
}
return fileId, true, nil
}