60 lines
1.4 KiB
Go
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
|
|
}
|