89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
package callback
|
|
|
|
import (
|
|
"archive/zip"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"lone-services/pkg/utils"
|
|
"lone-services/services/analysis/internal/dao"
|
|
)
|
|
|
|
func HandleTaskZip(zipPath string) (*dao.HandleZipResource, string, error) {
|
|
targetDir := filepath.Dir(zipPath)
|
|
subDirName := strings.TrimSuffix(filepath.Base(zipPath), filepath.Ext(zipPath))
|
|
finalDir := filepath.Join(targetDir, subDirName)
|
|
|
|
coverPath, err := unzipImages(zipPath, finalDir)
|
|
if err != nil {
|
|
return nil, utils.StringEmpty, err
|
|
}
|
|
|
|
return &dao.HandleZipResource{
|
|
FilePath: zipPath,
|
|
FinalDir: finalDir,
|
|
TargetDir: targetDir,
|
|
}, coverPath, nil
|
|
}
|
|
|
|
func unzipImages(zipPath, targetDir string) (string, error) {
|
|
if err := os.MkdirAll(targetDir, os.ModePerm); err != nil {
|
|
return utils.StringEmpty, err
|
|
}
|
|
|
|
r, err := zip.OpenReader(zipPath)
|
|
if err != nil {
|
|
return utils.StringEmpty, err
|
|
}
|
|
defer r.Close()
|
|
|
|
var crossMidPath string
|
|
for _, f := range r.File {
|
|
ext := strings.ToLower(filepath.Ext(f.Name))
|
|
if !isImageExt(ext) {
|
|
continue
|
|
}
|
|
|
|
rc, err := f.Open()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
filename := filepath.Base(f.Name)
|
|
if filename == utils.StringEmpty {
|
|
_ = rc.Close()
|
|
continue
|
|
}
|
|
|
|
fullPath := filepath.Join(targetDir, filename)
|
|
dst, err := os.Create(fullPath)
|
|
if err != nil {
|
|
_ = rc.Close()
|
|
continue
|
|
}
|
|
|
|
_, copyErr := io.Copy(dst, rc)
|
|
_ = dst.Close()
|
|
_ = rc.Close()
|
|
if copyErr != nil {
|
|
continue
|
|
}
|
|
|
|
if strings.EqualFold(filename, "cross_mid.jpg") {
|
|
crossMidPath = fullPath
|
|
}
|
|
}
|
|
return crossMidPath, nil
|
|
}
|
|
|
|
func isImageExt(ext string) bool {
|
|
switch ext {
|
|
case ".jpg", ".jpeg", ".png", ".gif":
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|