@@ -431,6 +431,52 @@ func (elf *ElFinderConnector) search() {
431431 elf .res = & ret
432432}
433433
434+ func (elf * ElFinderConnector ) duplicate () {
435+ added := make ([]FileDir , 0 , len (elf .req .Targets ))
436+ for _ , target := range elf .req .Targets {
437+ srcIDAndTarget := strings .Split (target , "_" )
438+ srcVol := elf .getVolume (srcIDAndTarget [0 ])
439+ srcPath , err := elf .parseTarget (strings .Join (srcIDAndTarget [1 :], "_" ))
440+ if err != nil {
441+ log .Println ("parse path err: " , err )
442+ continue
443+ }
444+ srcFileDir , err := srcVol .Info (srcPath )
445+ if err != nil {
446+ log .Println ("Get File err: " , err )
447+ continue
448+ }
449+ dstPath := filepath .Dir (srcPath )
450+ newName := createDuplicateName (srcFileDir .Name )
451+ if srcFileDir .Dirs == 1 {
452+ newDstDirFile , err := srcVol .MakeDir (dstPath , newName )
453+ if err != nil {
454+ log .Printf ("Make Dir err: %s" , err .Error ())
455+ elf .res .Error = []string {errMsg , err .Error ()}
456+ break
457+ }
458+ added = append (added , newDstDirFile )
459+ newAddFiles := elf .copyFolder (filepath .Join (dstPath , newDstDirFile .Name ), srcPath , srcVol , srcVol )
460+ added = append (added , newAddFiles ... )
461+ } else {
462+ srcFd , err := srcVol .GetFile (srcPath )
463+ if err != nil {
464+ log .Println ("Get File err: " , err .Error ())
465+ elf .res .Error = []string {errMsg , err .Error ()}
466+ break
467+ }
468+ dstFdInfo , err := srcVol .Paste (dstPath , newName , "_duplicate_" , srcFd )
469+ if err != nil {
470+ log .Println ("Duplicate path err: " , err )
471+ elf .res .Error = []string {errMsg , err .Error ()}
472+ break
473+ }
474+ added = append (added , dstFdInfo )
475+ }
476+ }
477+ elf .res .Added = added
478+ }
479+
434480func (elf * ElFinderConnector ) size () {
435481 var totalSize int64
436482 for _ , target := range elf .req .Targets {
@@ -700,6 +746,8 @@ func (elf *ElFinderConnector) dispatch(rw http.ResponseWriter, req *http.Request
700746 return
701747 case "search" :
702748 elf .search ()
749+ case "duplicate" :
750+ elf .duplicate ()
703751 default :
704752 elf .res .Error = errUnknownCmd
705753 }
@@ -912,3 +960,11 @@ func calculateFolderSize(v Volume, folderPath string) int64 {
912960 }
913961 return totalSize
914962}
963+
964+ func createDuplicateName (name string ) string {
965+ newFilename := strings .TrimSuffix (name ,
966+ filepath .Ext (name ))
967+ newFilename += "_duplicate_" + time .Now ().Format ("2006-01-02-15-04-05" )
968+ newFilename += filepath .Ext (name )
969+ return newFilename
970+ }
0 commit comments