A:更新工具类
This commit is contained in:
1 parent
f623b4e370
commit
39823db70a
6 files changed
+144
-21
No files matched your search
@@ -12,15 +12,24 @@ type Config struct {
|
|||||||
ReadTimeout time.Duration
|
ReadTimeout time.Duration
|
||||||
WriteTimeout time.Duration
|
WriteTimeout time.Duration
|
||||||
IdleTimeout time.Duration
|
IdleTimeout time.Duration
|
||||||
|
// 基础支持的格式
|
||||||
|
BaseSupportedFileTypes []string
|
||||||
|
// 特殊支持的格式
|
||||||
|
SpecialSupportedFileTypes []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var CONFIG Config
|
||||||
|
|
||||||
// InitConfig 初始化配置
|
// InitConfig 初始化配置
|
||||||
func InitConfig() *Config {
|
func InitConfig() *Config {
|
||||||
return &Config{
|
CONFIG = Config{
|
||||||
Port: utils.GetEnv("PORT", "8080"),
|
Port: utils.GetEnv("PORT", "8080"),
|
||||||
Mode: utils.GetEnv("GIN_MODE", "debug"),
|
Mode: utils.GetEnv("GIN_MODE", "debug"),
|
||||||
ReadTimeout: 30 * time.Second,
|
ReadTimeout: 30 * time.Second,
|
||||||
WriteTimeout: 30 * time.Second,
|
WriteTimeout: 30 * time.Second,
|
||||||
IdleTimeout: 60 * time.Second,
|
IdleTimeout: 60 * time.Second,
|
||||||
|
BaseSupportedFileTypes: []string{".jpg", ".jpeg", ".png", ".tif", ".tiff", ".bmp"},
|
||||||
|
SpecialSupportedFileTypes: []string{".gif", ".heic", ".heif", ".webp", ".avif", ".jxl"},
|
||||||
}
|
}
|
||||||
|
return &CONFIG
|
||||||
}
|
}
|
||||||
@@ -10,10 +10,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type DevImageHandler struct {
|
type DevImageHandler struct {
|
||||||
container *container.Container
|
container *container.DbContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDevImageHandler(container *container.Container) *DevImageHandler {
|
func NewDevImageHandler(container *container.DbContainer) *DevImageHandler {
|
||||||
return &DevImageHandler{container: container}
|
return &DevImageHandler{container: container}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,13 @@ package handler
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go.uber.org/zap"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"rear/internal/config"
|
||||||
"rear/internal/container"
|
"rear/internal/container"
|
||||||
"rear/internal/model"
|
"rear/internal/model"
|
||||||
|
"rear/pkg/logger"
|
||||||
"rear/pkg/utils"
|
"rear/pkg/utils"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -13,11 +16,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type LibraryHandler struct {
|
type LibraryHandler struct {
|
||||||
container *container.Container
|
container *container.DbContainer
|
||||||
imgContain *container.TaskContainer
|
imgContain *container.TaskContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLibraryHandler(container *container.Container, imgContain *container.TaskContainer) *LibraryHandler {
|
func NewLibraryHandler(container *container.DbContainer, imgContain *container.TaskContainer) *LibraryHandler {
|
||||||
return &LibraryHandler{container: container, imgContain: imgContain}
|
return &LibraryHandler{container: container, imgContain: imgContain}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +170,6 @@ func (h *LibraryHandler) LibraryIndex(c *gin.Context) {
|
|||||||
for i := range library {
|
for i := range library {
|
||||||
path := library[i]
|
path := library[i]
|
||||||
isDir := utils.FileUtils.IsDir(path.ImgPath)
|
isDir := utils.FileUtils.IsDir(path.ImgPath)
|
||||||
log.Printf(path.ImgPath)
|
|
||||||
if isDir {
|
if isDir {
|
||||||
dirs = append(dirs, path.ImgPath)
|
dirs = append(dirs, path.ImgPath)
|
||||||
}
|
}
|
||||||
@@ -182,15 +184,35 @@ func (h *LibraryHandler) LibraryIndex(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取可用路径下所有的照片【指定类型】
|
// 获取可用路径下所有的照片【指定类型】
|
||||||
//utils.FileUtils.GetAllFiles()
|
logger.Info(fmt.Sprintf("检索的列表: %v", dirs))
|
||||||
|
var fileList []string // 创建一个空的 string 切片
|
||||||
|
for i := range dirs {
|
||||||
|
dir := dirs[i]
|
||||||
|
|
||||||
|
files, err := utils.FileUtils.GetFilteredFiles(dir, true, config.CONFIG.BaseSupportedFileTypes)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("文件获取失败!", zap.Error(err))
|
||||||
|
c.JSON(http.StatusInternalServerError, model.Response{
|
||||||
|
Code: http.StatusInternalServerError,
|
||||||
|
Message: fmt.Sprintf("指定路径 %v 文件获取失败!", dir),
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for i2 := range files.SupportedFiles {
|
||||||
|
info := files.SupportedFiles[i2]
|
||||||
|
fileList = append(fileList, info.Path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.Info(fmt.Sprintf("得到的照片: %v", fileList))
|
||||||
|
|
||||||
// 启动后台任务,开始处理
|
// 启动后台任务,开始处理
|
||||||
//h.imgContain.ImgTaskManager.AddTask()
|
for i := range fileList {
|
||||||
|
file := fileList[i]
|
||||||
|
h.imgContain.ImgTaskManager.AddTask(file)
|
||||||
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, model.Response{
|
c.JSON(http.StatusOK, model.Response{
|
||||||
Code: http.StatusOK,
|
Code: http.StatusOK,
|
||||||
Message: "索引任务已启动",
|
Message: "索引任务已启动",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
//pushurl = https://github.com/duyl328/argus-go.git
|
|
||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// SetupRoutes 设置路由
|
// SetupRoutes 设置路由
|
||||||
func SetupRoutes(r *gin.Engine, contain *container.Container, imgContain *container.TaskContainer) {
|
func SetupRoutes(r *gin.Engine, contain *container.DbContainer, imgContain *container.TaskContainer) {
|
||||||
// 默认访问
|
// 默认访问
|
||||||
r.GET("/", handler.BasicResponse)
|
r.GET("/", handler.BasicResponse)
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -53,7 +53,7 @@ func main() {
|
|||||||
repositories.InitBaseService()
|
repositories.InitBaseService()
|
||||||
|
|
||||||
// 初始化照片管理任务
|
// 初始化照片管理任务
|
||||||
newTaskContainer := container.NewTaskContainer()
|
newTaskContainer := container.NewTaskContainer(newContainer)
|
||||||
|
|
||||||
// 创建运行目录
|
// 创建运行目录
|
||||||
execPath, err := os.Executable()
|
execPath, err := os.Executable()
|
||||||
@@ -78,7 +78,7 @@ func main() {
|
|||||||
startHttp(newContainer, newTaskContainer)
|
startHttp(newContainer, newTaskContainer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func startHttp(con *container.Container, imgContain *container.TaskContainer) {
|
func startHttp(con *container.DbContainer, imgContain *container.TaskContainer) {
|
||||||
// 配置加载
|
// 配置加载
|
||||||
netConfig := config.InitConfig()
|
netConfig := config.InitConfig()
|
||||||
// 设置Gin模式
|
// 设置Gin模式
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ type FileInfo struct {
|
|||||||
Ext string `json:"ext"`
|
Ext string `json:"ext"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FilteredFiles 包含按类型分类的文件结果
|
||||||
|
type FilteredFiles struct {
|
||||||
|
SupportedFiles []FileInfo // 支持的文件类型
|
||||||
|
OtherFiles []FileInfo // 其他文件类型
|
||||||
|
}
|
||||||
|
|
||||||
// fileUtilsStruct 用于封装文件工具方法
|
// fileUtilsStruct 用于封装文件工具方法
|
||||||
type fileUtilsStruct struct{}
|
type fileUtilsStruct struct{}
|
||||||
|
|
||||||
@@ -166,6 +172,78 @@ func (fileUtilsStruct) GetAllFiles(dirPath string, recursive bool) ([]FileInfo,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetFilteredFiles 根据指定的文件类型递归获取文件,并按类型分类
|
||||||
|
func (fileUtilsStruct) GetFilteredFiles(dirPath string, recursive bool, supportedTypes []string) (*FilteredFiles, error) {
|
||||||
|
var result FilteredFiles
|
||||||
|
|
||||||
|
// 将支持的文件类型转换为map,便于快速查找(转为小写)
|
||||||
|
supportedMap := make(map[string]bool)
|
||||||
|
for _, ext := range supportedTypes {
|
||||||
|
supportedMap[strings.ToLower(ext)] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if recursive {
|
||||||
|
err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !info.IsDir() {
|
||||||
|
fileInfo := FileInfo{
|
||||||
|
Name: info.Name(),
|
||||||
|
Path: path,
|
||||||
|
Size: info.Size(),
|
||||||
|
ModTime: info.ModTime(),
|
||||||
|
IsDir: false,
|
||||||
|
Ext: filepath.Ext(info.Name()),
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查文件扩展名是否在支持列表中(不区分大小写)
|
||||||
|
ext := strings.ToLower(filepath.Ext(info.Name()))
|
||||||
|
if supportedMap[ext] {
|
||||||
|
result.SupportedFiles = append(result.SupportedFiles, fileInfo)
|
||||||
|
} else {
|
||||||
|
result.OtherFiles = append(result.OtherFiles, fileInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return &result, err
|
||||||
|
} else {
|
||||||
|
entries, err := os.ReadDir(dirPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("读取目录失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, entry := range entries {
|
||||||
|
if !entry.IsDir() {
|
||||||
|
info, err := entry.Info()
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
fileInfo := FileInfo{
|
||||||
|
Name: info.Name(),
|
||||||
|
Path: filepath.Join(dirPath, info.Name()),
|
||||||
|
Size: info.Size(),
|
||||||
|
ModTime: info.ModTime(),
|
||||||
|
IsDir: false,
|
||||||
|
Ext: filepath.Ext(info.Name()),
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查文件扩展名是否在支持列表中(不区分大小写)
|
||||||
|
ext := strings.ToLower(filepath.Ext(info.Name()))
|
||||||
|
if supportedMap[ext] {
|
||||||
|
result.SupportedFiles = append(result.SupportedFiles, fileInfo)
|
||||||
|
} else {
|
||||||
|
result.OtherFiles = append(result.OtherFiles, fileInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &result, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 递归获取目录下所有文件夹
|
// 递归获取目录下所有文件夹
|
||||||
func (fileUtilsStruct) GetAllDirs(dirPath string, recursive bool) ([]FileInfo, error) {
|
func (fileUtilsStruct) GetAllDirs(dirPath string, recursive bool) ([]FileInfo, error) {
|
||||||
var dirs []FileInfo
|
var dirs []FileInfo
|
||||||
@@ -233,6 +311,12 @@ func (fileUtilsStruct) CreateDir(dirPath string) error {
|
|||||||
|
|
||||||
// 10. 复制文件
|
// 10. 复制文件
|
||||||
func (f fileUtilsStruct) CopyFile(src, dst string) error {
|
func (f fileUtilsStruct) CopyFile(src, dst string) error {
|
||||||
|
// 检查目标文件是否存在
|
||||||
|
if _, err := os.Stat(dst); err == nil {
|
||||||
|
// 目标文件存在,跳过
|
||||||
|
return os.ErrExist
|
||||||
|
}
|
||||||
|
|
||||||
sourceFile, err := os.Open(src)
|
sourceFile, err := os.Open(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("打开源文件失败: %w", err)
|
return fmt.Errorf("打开源文件失败: %w", err)
|
||||||
@@ -298,11 +382,19 @@ func (f fileUtilsStruct) CopyDir(src, dst string) error {
|
|||||||
if entry.IsDir() {
|
if entry.IsDir() {
|
||||||
// 如果是目录,递归复制
|
// 如果是目录,递归复制
|
||||||
if err := f.CopyDir(srcPath, dstPath); err != nil {
|
if err := f.CopyDir(srcPath, dstPath); err != nil {
|
||||||
return fmt.Errorf("复制子目录 %s 失败: %w", entry.Name(), err)
|
// 子目录失败也继续复制其他内容
|
||||||
|
fmt.Printf("[WARN] 复制子目录 %s 失败: %v\n", entry.Name(), err)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 如果是文件,使用你的 CopyFile 函数
|
err := f.CopyFile(srcPath, dstPath)
|
||||||
if err := f.CopyFile(srcPath, dstPath); err != nil {
|
if err != nil {
|
||||||
|
// 判断是否是文件已存在或拒绝访问
|
||||||
|
if os.IsPermission(err) || os.IsExist(err) {
|
||||||
|
fmt.Printf("[WARN] 复制文件 %s 被跳过: %v\n", dstPath, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 其他错误还是报错
|
||||||
return fmt.Errorf("复制文件 %s 失败: %w", entry.Name(), err)
|
return fmt.Errorf("复制文件 %s 失败: %w", entry.Name(), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user