Files
tyapi-server/internal/shared/pdf/resources_path.go
2025-12-04 13:42:32 +08:00

92 lines
2.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package pdf
import (
"os"
"path/filepath"
"go.uber.org/zap"
)
var globalLogger *zap.Logger
// SetGlobalLogger 设置全局logger用于资源路径查找
func SetGlobalLogger(logger *zap.Logger) {
globalLogger = logger
}
// GetResourcesPDFDir 获取resources/pdf目录路径绝对路径
// resources目录和可执行文件同级例如
// 生产环境:/app/tyapi-server (可执行文件) 和 /app/resources/pdf (资源文件)
// 开发环境:工作目录下的 resources/pdf 或 tyapi-server-gin/resources/pdf
func GetResourcesPDFDir() string {
// 候选路径列表(按优先级排序)
var candidatePaths []string
// 优先级1: 从可执行文件所在目录查找(生产环境和开发环境都适用)
if execPath, err := os.Executable(); err == nil {
execDir := filepath.Dir(execPath)
// 处理符号链接
if realPath, err := filepath.EvalSymlinks(execPath); err == nil {
execDir = filepath.Dir(realPath)
}
candidatePaths = append(candidatePaths, filepath.Join(execDir, "resources", "pdf"))
}
// 优先级2: 从工作目录查找(开发环境)
if workDir, err := os.Getwd(); err == nil {
candidatePaths = append(candidatePaths,
filepath.Join(workDir, "resources", "pdf"),
filepath.Join(workDir, "tyapi-server-gin", "resources", "pdf"),
)
}
// 尝试每个候选路径
for _, candidatePath := range candidatePaths {
absPath, err := filepath.Abs(candidatePath)
if err != nil {
continue
}
if globalLogger != nil {
globalLogger.Debug("尝试查找resources/pdf目录", zap.String("path", absPath))
}
// 检查目录是否存在
if info, err := os.Stat(absPath); err == nil && info.IsDir() {
if globalLogger != nil {
globalLogger.Info("找到resources/pdf目录", zap.String("path", absPath))
}
return absPath
}
}
// 所有候选路径都不存在,返回第一个候选路径的绝对路径(作为后备)
// 这样至少保证返回的是绝对路径,即使目录不存在
if len(candidatePaths) > 0 {
if absPath, err := filepath.Abs(candidatePaths[0]); err == nil {
if globalLogger != nil {
globalLogger.Warn("未找到resources/pdf目录返回后备绝对路径", zap.String("path", absPath))
}
return absPath
}
}
// 最后的最后:从工作目录构建绝对路径
if workDir, err := os.Getwd(); err == nil {
absPath, err := filepath.Abs(filepath.Join(workDir, "resources", "pdf"))
if err == nil {
if globalLogger != nil {
globalLogger.Error("无法确定resources/pdf目录返回工作目录下的绝对路径", zap.String("path", absPath))
}
return absPath
}
}
// 完全无法确定路径
if globalLogger != nil {
globalLogger.Error("完全无法确定resources/pdf目录路径")
}
return ""
}