@@ -57,6 +57,7 @@ type IFileService interface {
5757 Delete (op request.FileDelete ) error
5858 BatchDelete (op request.FileBatchDelete ) error
5959 Compress (c request.FileCompress ) error
60+ StopCompress (taskID string ) error
6061 DeCompress (c request.FileDeCompress ) error
6162 GetContent (op request.FileContentReq ) (response.FileInfo , error )
6263 GetPreviewContent (op request.FileContentReq ) (response.FileInfo , error )
@@ -425,7 +426,58 @@ func (f *FileService) Compress(c request.FileCompress) error {
425426 if ! c .Replace && fo .Stat (filepath .Join (c .Dst , c .Name )) {
426427 return buserr .New ("ErrFileIsExist" )
427428 }
428- return fo .Compress (c .Files , c .Dst , c .Name , files .CompressType (c .Type ), c .Secret )
429+ if err := preflightCompressTool (files .CompressType (c .Type )); err != nil {
430+ return err
431+ }
432+ taskItem , err := task .NewTask (c .Name , task .TaskExec , task .TaskScopeTask , c .TaskID , 1 )
433+ if err != nil {
434+ return err
435+ }
436+ go func () {
437+ taskItem .AddSubTask (c .Name , func (t * task.Task ) error {
438+ t .LogStart (c .Name )
439+ compressType := files .CompressType (c .Type )
440+ dstFile := filepath .Join (c .Dst , c .Name )
441+ success := false
442+ defer func () {
443+ if ! success {
444+ _ = os .Remove (dstFile )
445+ }
446+ }()
447+ if err := fo .Compress (t .TaskCtx , c .Files , c .Dst , c .Name , compressType , c .Secret , nil ); err != nil {
448+ return err
449+ }
450+ info , err := os .Stat (dstFile )
451+ if err != nil {
452+ return err
453+ }
454+ if info .Size () == 0 {
455+ return fmt .Errorf ("compressed file not generated: %s" , dstFile )
456+ }
457+ success = true
458+ return nil
459+ }, nil )
460+ _ = taskItem .Execute ()
461+ }()
462+ return nil
463+ }
464+
465+ func preflightCompressTool (compressType files.CompressType ) error {
466+ switch compressType {
467+ case files .TarGz , files .Rar , files .X7z :
468+ _ , err := files .NewShellArchiver (compressType )
469+ return err
470+ default :
471+ return nil
472+ }
473+ }
474+
475+ func (f * FileService ) StopCompress (taskID string ) error {
476+ if cancel , ok := global .TaskCtxMap [taskID ]; ok {
477+ cancel ()
478+ return nil
479+ }
480+ return buserr .New ("TaskNotFound" )
429481}
430482
431483func (f * FileService ) DeCompress (c request.FileDeCompress ) error {
@@ -694,7 +746,7 @@ func (f *FileService) FileDownload(d request.FileDownload) (string, error) {
694746 return "" , err
695747 }
696748 fo := files .NewFileOp ()
697- if err := fo .Compress (d .Paths , tempPath , d .Name , files .CompressType (d .Type ), "" ); err != nil {
749+ if err := fo .Compress (context . Background (), d .Paths , tempPath , d .Name , files .CompressType (d .Type ), "" , nil ); err != nil {
698750 return "" , err
699751 }
700752 filePath = filepath .Join (tempPath , d .Name )
0 commit comments