// 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 }